как циклом for рассмотреть каждый элемент многомерного массива
например, есть массив
list = np.array([['p', 'r', 'h', 'j', 'p'],
['g', 'y', 'k', 'l', 'e'],
['p', 't', 'p', 't', 'x']])
я делаю shape и добавляю счетчик
x, y = list.shape
counter = 0
потом пытаюсь перебрать элементы массива
for i in range(x):
for j in range(y):
if j == 'p':
counter += list[j]
print(counter)
но в итоге получается 0.
Подскажите, пожалуйста, что я делаю не так.
Ответы (1 шт):
При работе с numpy вообще не нужно использовать циклы, операции обычно делаются сразу над всем массивом. Например, если я правильно понял, что вы хотите посчитать, это делается гораздо проще:
import numpy as np
arr = np.array([['p', 'r', 'h', 'j', 'p'],
['g', 'y', 'k', 'l', 'e'],
['p', 't', 'p', 't', 'x']])
print((arr == 'p').sum())
# 4
То есть просто сравниваете сразу весь массив с нужным значением, потом суммируете, пользуясь тем, что True считается как 1, а False как 0.
И не нужно называть ваши переменные ключевыми словами питона, list - это тип в питоне, вы его скрываете, называя переменную этим именем, потом сюрприз будет, когда вы захотите воспользоваться типом list.
Но если всё же захотите через циклы, то и это лучше делать более "питонячим" способом - перебором сущностей, а не индексов (если вы просто анализируете сущности и вам не нужно их менять):
counter = 0
for row in arr:
for item in row:
if item == 'p':
counter += 1
print(counter)
# 4