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.