2016-06-30 47 views
8

Numaralı dizileri (matrisler) parantezlerle indeksleme eğilimindeyim, ancak bir dizi (matris) dilimlemek istediğimde fark ettim, virgül notasyonu kullanmalıyım. Bu neden? Örneğin,Köşeli ayraçlar ve virgüllerle uyuşan numpy dizileri davranışta neden farklılık gösterir?

>>> x = numpy.array([[1, 2], [3, 4], [5, 6]]) 
>>> x 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 
>>> x[1][1] 
4     # expected behavior 
>>> x[1,1] 
4     # expected behavior 
>>> x[:][1] 
array([3, 4])  # huh? 
>>> x[:,1] 
array([2, 4, 6]) # expected behavior 
+1

x [1] 'veya' x [:] '' in x [1] [1] 'veya' x [:] [1] 'i anlamadan önce ne yaptığını anlamanız gerekir. İki braket sırayla, 2 '__getitem__' çağrıları ile uygulanır. Ama 'x [:, 1]' de her iki eksen birlikte düşünülür - bir 'numpy'' __getitem__' çağrısı ile. – hpaulj

+0

Teşekkür ederim @hpaulj, aradığım cevap bu. – BoltzmannBrain

cevap

13

Bu:

x[:, 1] 

demektir

"İlk eksen boyunca x tüm indisleri almak, ama ikinci boyunca sadece indeks 1".

Bu:

x[:][1] 

anlamına gelen "birinci eksen (x yani tüm), daha sonra sonuç ilk eksen boyunca indeksi 1 almak boyunca x tüm indisleri çekmek". 1'u yanlış eksene uyguluyorsunuz. bir tamsayı olan bir dizi indeksleme şekil önüne doğru geri kalan bütün eksenleri kaydırdığı için

x[1][2] ve x[1, 2] sadece eşdeğerdir, bu x[1] birinci ekseni x ikinci eksenidir. Bu genel olarak genellenmez; Birden çok dizin oluşturma adımı yerine hemen her zaman virgül kullanmalısınız.

1

Dizinin çoklu boyutunu kaydırdığınızda, eksen sayısından daha az sayıda dizin sağlanırsa, eksik dizinler tam dilimler olarak kabul edilir. Bu nedenle, x[:][1] numaralı telefonu ararken esasen yaptığınız zaman, x[:,:][1,:] Bu nedenle, x[:,:] yalnızca x'in kendisini döndürecektir.