Numpy bagaimana cara mengulang kolom array?


109

Misalkan saya memiliki dan mxn array. Saya ingin meneruskan setiap kolom dari larik ini ke suatu fungsi untuk melakukan beberapa operasi di seluruh kolom. Bagaimana cara melakukan iterasi pada kolom array?

Misalnya, saya memiliki array 4 x 3 seperti

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

for column in array:
  some_function(column)

di mana kolom akan menjadi "1,2,3,4" di iterasi pertama, "99,14,12,43" di iterasi kedua, dan "2,5,7,1" di iterasi ketiga.


2
Tidak bisakah Anda menggunakan indeks --- stackoverflow.com/questions/4455076/…
ev-br

Jawaban:


225

Cukup lakukan iterasi atas transposisi array Anda:

for column in array.T:
   some_function(column)

6
Apa cara yang baik untuk menggabungkan hasil kembali menjadi satu larik?
Ibrahim Muhammad

46
Bagi mereka yang bertanya-tanya, array.Ttidak mahal, karena itu hanya mengubah 'langkah' array(lihat jawaban ini untuk diskusi yang menarik)
drevicko

19

Ini seharusnya memberi Anda awal

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


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

7
Bagiku tidak terlihat seperti ular piton.
gronostaj

@gronostaj Tentu saja Pythonic. Bagaimana lagi Anda akan menyelesaikan masalah ini saat Anda ingin mengulang sumbu arbitrer dari array multidimensi?
Neil G

1
@NeilG Pertanyaan ini hanya tentang array 2 dimensi.
gronostaj

6

Untuk array tiga dimensi Anda bisa mencoba:

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

Lihat dokumen tentang cara array.transposekerjanya. Pada dasarnya Anda menentukan dimensi mana yang akan digeser. Dalam hal ini kami menggeser dimensi kedua (misalnya kolom) ke dimensi pertama.


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

4

Anda juga dapat menggunakan unzip untuk mengulang melalui kolom

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

2

Misalnya Anda ingin mencari rata-rata setiap kolom dalam matriks. Mari buat matriks berikut

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

Fungsi mean adalah

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

Untuk melakukan apa yang diperlukan dan menyimpan hasil dalam 'hasil' vektor titik dua

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

results = mat2[1,:]      

Hasilnya adalah: larik ([4.33333333, 5., 5.66666667, 4.])


0

Atau, Anda bisa menggunakan enumerate. Ini memberi Anda nomor kolom dan nilai kolom juga.

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 

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.