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.

Pengguna
sumber
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)
Tillsten
sumber
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]
Abhijit
sumber
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.

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

Anda juga dapat menggunakan unzip untuk mengulang melalui kolom

for col in zip(*array):
   some_function(col)
Adi
sumber
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.])

Lucy Nowacki
sumber
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 

Bank
sumber