Numpy como iterar em colunas de array?

109

Suponha que eu tenha um array mxn. Eu quero passar cada coluna desta matriz para uma função para realizar alguma operação em toda a coluna. Como faço para iterar nas colunas da matriz?

Por exemplo, eu tenho uma matriz 4 x 3 como

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

for column in array:
  some_function(column)

onde a coluna seria "1,2,3,4" na primeira iteração, "99,14,12,43" na segunda e "2,5,7,1" na terceira.

Do utilizador
fonte
2
Você não pode usar um índice --- stackoverflow.com/questions/4455076/…
ev-br

Respostas:

225

Apenas itere sobre a transposição de sua matriz:

for column in array.T:
   some_function(column)
Tiltstênio
fonte
6
Qual seria uma boa maneira de combinar o resultado de volta em uma única matriz?
Ibrahim Muhammad
46
Para quem está se perguntando, array.Tnão é caro, pois apenas muda os 'avanços' de array(veja esta resposta para uma discussão interessante)
drevicko
19

Isso deve te dar um começo

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


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]
Abhijit
fonte
7
Não me parece pitônico.
gronostaj
@gronostaj Claro que é Pythônico. De que outra forma você resolveria esse problema quando deseja iterar sobre um eixo arbitrário de uma matriz multidimensional?
Neil G
1
@NeilG Esta questão é estritamente sobre arrays bidimensionais.
gronostaj
6

Para uma matriz tridimensional, você pode tentar:

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

Veja a documentação sobre como array.transposefunciona. Basicamente, você está especificando qual dimensão mudar. Neste caso, estamos mudando a segunda dimensão (por exemplo, colunas) para a primeira dimensão.

Steve
fonte
5
for c in np.hsplit(array, array.shape[1]):
    some_fun(c)
EricX
fonte
4

Você também pode usar unzip para percorrer as colunas

for col in zip(*array):
   some_function(col)
Adi
fonte
2

Por exemplo, você deseja encontrar a média de cada coluna na matriz. Vamos criar a seguinte matriz

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

A função para média é

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

Para fazer o que é necessário e armazenar o resultado nos 'resultados' do vetor de cólon

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

results = mat2[1,:]      

Os resultados são: array ([4.33333333, 5., 5.66666667, 4.])

Lucy Nowacki
fonte
0

Alternativamente, você pode usar enumerate. Fornece o número da coluna e os valores da coluna também.

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 

Bancos
fonte