2014-09-18 21 views
5

Bir sorum var: bir alt dizinin boolean dilimlemeyle nasıl alt matris elde edilir?Numpy, boolean dilimleme ile alt matris nasıl elde edilir

Örneğin:

array([[12, 13, 14, 15, 16, 17], 
      [18, 19, 20, 21, 22, 23], 
      [24, 25, 26, 27, 28, 29]]) 

ama:

a2 = np.array(np.arange(30).reshape(5, 6)) 
    a2[a2[:, 1] > 10] 

bana verecek

m2 = np.mat(np.arange(30).reshape(5, 6)) 
    m2[m2[:, 1] > 10] 

beni verecektir:

matrix([[12, 18, 24]]) 

Neden çıktı farklı ve Matrix'ten dizi olarak aynı sonucu nasıl alabilirim?

Teşekkür ederiz!

cevap

4

Yaşadığınız sorun, matris dönüşü üzerindeki işlemlerin her zaman 2 boyutlu bir dizi döndürdüğü gerçeğine iner.

ilk dizide maske inşa

elde edersiniz:

In [24]: a2[:,1] > 10 
Out[24]: array([False, False, True, True, True], dtype=bool) 

gördüğünüz gibi, hangi, 1 boyutlu bir dizidir. Eğer matris ile aynı şeyi yaptığınızda

elde edersiniz:

In [25]: m2[:,1] > 10 
Out[25]: 
matrix([[False], 
     [False], 
     [ True], 
     [ True], 
     [ True]], dtype=bool) 

Başka bir deyişle, bir nx1 dizi değil n uzunluğundaki dizisi var. Numpy içinde


İndeksleme farklı bir birinden veya n boyutlu bir dizi ile indeksleme olmanıza göre çalışmaktadır.

İlk durumda

, numpy satırın endeksi olarak n uzunluğundaki dizi tedavi edecek, böylece beklenen sonucu elde edersiniz: Eğer 2 boyutlu endeksine sahip çünkü, İkinci durumda

In [28]: a2[a2[:,1] > 10] 
Out[28]: 
array([[12, 13, 14, 15, 16, 17], 
     [18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29]]) 

dizi, numpy satır ve sütun hem ayıklamak için yeterli bilgiye sahiptir ve bu yüzden sadece eşleştirmesi sütunu (ilki) şeyleri yakalar:

In [29]: m2[m2[:,1] > 10] 
Out[29]: matrix([[12, 18, 24]]) 

sorunuza cevap için: ca n n uzunluğundaki başlangıçtaki dizi ayıklamak için, ilk sütunu bir diziye maskelerinizi dönüştürerek ve kapma bu davranışı olsun: Alternatif

In [32]: m2[np.array(m2[:,1] > 10)[:,0]] 
Out[32]: 
matrix([[12, 13, 14, 15, 16, 17], 
     [18, 19, 20, 21, 22, 23], 
     [24, 25, 26, 27, 28, 29]]) 

, daha önce aynı sonucu almak ilk dönüşümü yapabileceği:

In [34]: np.array(m2)[:,1] > 10 
Out[34]: array([False, False, True, True, True], dtype=bool) 

Şimdi bu düzeltmelerin hem oldukça çirkin olabilir matrisleri ve diziler arasındaki dönüşümleri gerektirmektedir.

Kendinize soracağım soru, neden bir matris kullanmak istediğiniz ve bir dizinin davranışını beklemenizdir. İşiniz için doğru araç aslında bir dizidir, bir matris değildir.

+0

Teşekkür ederim, Sapi. Ben dizi ve matrisin numpy cinsinden eşdeğer olduğunu düşündüm, ama değiller. – pinseng

+0

@pinseng Genel bir kural olarak, matris matematiği yapmanız gerekmedikçe diziye yapışmak en iyisidir (bu durumda, tanımlanan matris işlemlerinin rahatlığı, burada görülen sorunları aşabilir) – sapi

+0

Merhaba Sapi, başka bir soru sorabilir miyim: neden np.array (2) 've' np.array ([2]) 'farklı sonuçlar verir, ancak np.mat (2)' ve 'np.mat ([2])' aynı sonuçları verir? – pinseng

1

sizin gibi boole maske yassılaştırırsanız: Aynı sonucu elde

m2[np.asarray(m2[:,1]>10).flatten()] 

, ama bunun yerine np.matrixfor the reasons given in this answer ait np.array kullanarak öneriyoruz.

İlgili konular