как циклом 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 шт):

Автор решения: CrazyElf

При работе с 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
→ Ссылка