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.


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)

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]

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.


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

4

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

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

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.])


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 

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.