Numpy come iterare su colonne di array?


109

Supponiamo che io abbia e mxn array. Voglio passare ogni colonna di questo array a una funzione per eseguire alcune operazioni sull'intera colonna. Come si itera sulle colonne dell'array?

Ad esempio, ho un array 4 x 3 come

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

for column in array:
  some_function(column)

dove la colonna sarebbe "1,2,3,4" nella prima iterazione, "99,14,12,43" nella seconda e "2,5,7,1" nella terza.


2
Non puoi usare un indice --- stackoverflow.com/questions/4455076/…
ev-br

Risposte:


225

Basta iterare sul trasposto del tuo array:

for column in array.T:
   some_function(column)

6
Quale sarebbe un buon modo per combinare il risultato in un unico array?
Ibrahim Muhammad

46
Per coloro che si chiedono, array.Tnon è costoso, in quanto cambia solo i 'passi' di array(vedi questa risposta per una discussione interessante)
drevicko

19

Questo dovrebbe darti un inizio

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


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

7
A me non sembra pitonico.
gronostaj

@gronostaj Ovviamente è Pythonic. In quale altro modo risolveresti questo problema quando desideri iterare su un asse arbitrario di un array multidimensionale?
Neil G

1
@ NeilG Questa domanda riguarda strettamente gli array bidimensionali.
gronostaj

6

Per una matrice tridimensionale potresti provare:

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

Guarda i documenti su come array.transposefunziona. Fondamentalmente stai specificando quale dimensione spostare. In questo caso stiamo spostando la seconda dimensione (ad esempio colonne) alla prima dimensione.


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

4

Puoi anche usare unzip per scorrere le colonne

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

2

Ad esempio, vuoi trovare una media di ogni colonna nella matrice. Creiamo la seguente matrice

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

La funzione per la media è

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

Per fare ciò che è necessario e memorizzare il risultato nei "risultati" del vettore del colon

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

results = mat2[1,:]      

I risultati sono: array ([4.33333333, 5., 5.66666667, 4.])


0

In alternativa, puoi usare enumerate. Ti dà anche il numero della colonna e i valori della colonna.

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 

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.