Numpy, як перебирати стовпці масиву?


109

Припустимо, у мене є і mxn масив. Я хочу передати кожен стовпець цього масиву функції, щоб виконати деяку операцію над усім стовпцем. Як я повторюю стовпці масиву?

Наприклад, у мене є масив розміром 4 х 3

1  99 2
2  14 5
3  12 7
4  43 1

for column in array:
  some_function(column)

де стовпчик буде "1,2,3,4" у першій ітерації, "99,14,12,43" у другій та "2,5,7,1" у третій.


2
Не можете використовувати індекс --- stackoverflow.com/questions/4455076/…
ev-br

Відповіді:


225

Просто повторіть перенесений масив:

for column in array.T:
   some_function(column)

6
Який був би хороший спосіб об’єднати результат назад в єдиний масив?
Ібрагім Мухаммед

46
Для тих, хто цікавиться, array.Tце не дорого, оскільки це просто змінює «крок» array(див. Цю відповідь для цікавої дискусії)
drevicko

19

Це має дати вам початок

>>> for col in range(arr.shape[1]):
    some_function(arr[:,col])


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]

7
Для мене це не виглядає пітонічно.
gronostaj

@gronostaj Звичайно, це Pythonic. Як інакше ви вирішили цю проблему, коли хочете перебрати через довільну вісь багатовимірного масиву?
Ніл Г

1
@NeilG Це питання стосується суто двовимірних масивів.
gronostaj

6

Для тривимірного масиву ви можете спробувати:

for c in array.transpose(1, 0, 2):
    do_stuff(c)

Дивіться документи про те, як array.transposeпрацює. В основному ви вказуєте, який саме розмір потрібно змінити. У цьому випадку ми зміщуємо другий вимір (наприклад, стовпці) до першого.



4

Ви також можете використовувати розпакування для ітерації через стовпці

for col in zip(*array):
   some_function(col)

2

Наприклад, ви хочете знайти середнє значення кожного стовпця в матриці. Створимо наступну матрицю

mat2 = np.array([1,5,6,7,3,0,3,5,9,10,8,0], dtype=np.float64).reshape(3, 4)

Функція для середнього значення є

def my_mean(x):
    return sum(x)/len(x)

Щоб зробити те, що потрібно, і зберегти результат у векторі товстої кишки "результати"

results = np.zeros(4)
for i in range(0, 4):
    mat2[:, i] = my_mean(mat2[:, i])

results = mat2[1,:]      

Результати: масив ([4.33333333, 5., 5.66666667, 4.])


0

Як варіант, ви можете використовувати enumerate. Він дає вам номер стовпця та значення стовпця.

for num, column in enumerate(array.T):
    some_function(column) # column: Gives you the column value as asked in the question
    some_function(num) # num: Gives you the column number 

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.