Numpy, как перебирать столбцы массива?


109

Допустим, у меня есть и массив mxn. Я хочу передать каждый столбец этого массива функции для выполнения некоторой операции над всем столбцом. Как мне перебрать столбцы массива?

Например, у меня есть массив 4 x 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

Ответы:


226

Просто переберите транспонированный массив:

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. Как еще вы могли бы решить эту проблему, если вы хотите перебрать произвольную ось многомерного массива?
— Neil G

1
@NeilG Этот вопрос касается только двумерных массивов.
— gronostaj

6

Для трехмерного массива вы можете попробовать:

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

См. Документацию о том, как array.transposeработает. По сути, вы указываете, какой размер сдвинуть. В этом случае мы перемещаем второе измерение (например, столбцы) в первое измерение.



4

Вы также можете использовать unzip для перебора столбцов

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.