Numpy, dizi sütunları üzerinde nasıl yinelenir?


109

Bir mxn dizim olduğunu varsayalım. Bu dizinin her sütununu, tüm sütunda bazı işlemler gerçekleştirmek için bir işleve geçirmek istiyorum. Dizinin sütunları üzerinde nasıl yineleme yaparım?

Örneğin, 4 x 3 dizim var gibi

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

for column in array:
  some_function(column)

burada sütun ilk yinelemede "1,2,3,4", ikinci yinelemede "99,14,12,43" ve üçüncü yinelemede "2,5,7,1" olacaktır.


2
Bir dizin kullanamıyor musunuz --- stackoverflow.com/questions/4455076/…
ev-br

Yanıtlar:


225

Sadece dizinizin aktarılmışını yineleyin:

for column in array.T:
   some_function(column)

6
Sonucu tek bir dizide birleştirmenin iyi bir yolu nedir?
İbrahim Muhammed

46
Merak edenler için, array.Tpahalı değil, çünkü sadece 'adımlarını' değiştiriyor array( ilginç bir tartışma için bu yanıta bakın )
drevicko

19

Bu sana bir başlangıç ​​vermeli

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


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

7
Bana pitonik görünmüyor.
gronostaj

@gronostaj Tabii ki Pythonic. Çok boyutlu bir dizinin keyfi bir ekseni üzerinde yineleme yapmak istediğinizde bu sorunu başka nasıl çözersiniz?
Neil G

1
@NeilG Bu soru kesinlikle 2 boyutlu dizilerle ilgili.
gronostaj

6

Üç boyutlu bir dizi için şunları deneyebilirsiniz:

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

Nasıl array.transposeçalıştığıyla ilgili belgelere bakın . Temel olarak hangi boyutun kaydırılacağını belirliyorsunuz. Bu durumda ikinci boyutu (örneğin sütunlar) birinci boyuta kaydırıyoruz.


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

4

Sütunlar arasında yineleme yapmak için unzip'i de kullanabilirsiniz.

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

2

Örneğin, matristeki her sütunun ortalamasını bulmak istiyorsunuz. Aşağıdaki matrisi oluşturalım

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

Ortalamanın işlevi

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

Gerekeni yapmak ve sonucu kolon vektörü 'sonuçlar' ile saklamak

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

results = mat2[1,:]      

Sonuçlar şunlardır: dizi ([4.33333333, 5., 5.66666667, 4.])


0

Alternatif olarak kullanabilirsiniz enumerate. Size sütun numarasını ve sütun değerlerini de verir.

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 

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.