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)
Tillsten
источник
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работает. По сути, вы указываете, какой размер сдвинуть. В этом случае мы перемещаем второе измерение (например, столбцы) в первое измерение.

Stevej
источник
5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)
EricX
источник
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 

банки
источник