Numpy, wie man über Array-Spalten iteriert?

109

Angenommen, ich habe ein mxn-Array. Ich möchte jede Spalte dieses Arrays an eine Funktion übergeben, um eine Operation für die gesamte Spalte auszuführen. Wie iteriere ich über die Spalten des Arrays?

Zum Beispiel habe ich ein 4 x 3 Array wie

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

for column in array:
  some_function(column)

wobei die Spalte in der ersten Iteration "1,2,3,4", in der zweiten "99,14,12,43" und in der dritten "2,5,7,1" wäre.

Benutzer
quelle
2
Können Sie keinen Index verwenden --- stackoverflow.com/questions/4455076/…
ev-br

Antworten:

225

Iterieren Sie einfach über die Transponierte Ihres Arrays:

for column in array.T:
   some_function(column)
Tillsten
quelle
6
Was wäre ein guter Weg, um das Ergebnis wieder in einem einzigen Array zu kombinieren?
Ibrahim Muhammad
46
Für diejenigen, die sich fragen, array.Tist es nicht teuer, da es nur die "Schritte" von ändert array(siehe diese Antwort für eine interessante Diskussion)
drevicko
19

Dies sollte Ihnen einen Anfang geben

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


[1 2 3 4]
[99 14 12 43]
[2 5 7 1]
Abhijit
quelle
7
Es sieht für mich nicht pythonisch aus.
Gronostaj
@gronostaj Natürlich ist es Pythonic. Wie sonst würden Sie dieses Problem lösen, wenn Sie über eine beliebige Achse eines mehrdimensionalen Arrays iterieren möchten?
Neil G
1
@NeilG Bei dieser Frage geht es ausschließlich um zweidimensionale Arrays.
Gronostaj
6

Für ein dreidimensionales Array könnten Sie versuchen:

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

Informationen zur Funktionsweise finden Sie in den Dokumenten array.transpose. Grundsätzlich geben Sie an, welche Dimension verschoben werden soll. In diesem Fall verschieben wir die zweite Dimension (z. B. Spalten) in die erste Dimension.

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

Sie können auch entpacken verwenden, um durch die Spalten zu iterieren

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

Sie möchten beispielsweise einen Mittelwert für jede Spalte in der Matrix ermitteln. Lassen Sie uns die folgende Matrix erstellen

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

Die Funktion für Mittelwert ist

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

Um das zu tun, was benötigt wird, speichern Sie das Ergebnis im Doppelpunktvektor "Ergebnisse".

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

results = mat2[1,:]      

Die Ergebnisse sind: Array ([4.33333333, 5., 5.66666667, 4.])

Lucy Nowacki
quelle
0

Alternativ können Sie verwenden enumerate. Es gibt Ihnen auch die Spaltennummer und die Spaltenwerte.

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 

Banken
quelle