2017-08-03 45 views
9

Dizilerim var x = np.arange(6).reshape(3, 2).`x [False]` nezdinde ne yapıyor?

x[False] veya x[np.asanyarray(False)] anlamı nedir? Her ikisi de beklenmedik olan ile sonuçlanır. gibi bir boyuttan dolayı uygun boyutta olmayan bir maske nedeniyle IndexError alabilmem bekleniyor.

Bu davranış ek boyut hem de sonuç olarak, x[True] ve x[np.asanyarray(True)] için tutarlı olup: array([[[0, 1], [2, 3], [4, 5]]]).

Numpy 1.13.1 kullanıyorum. Davranışın yakın zamanda değiştiği görülüyor, bu nedenle eski sürümlerin yanıtlarını almak güzel olsa da, lütfen yanıtlarınızda sürümünüzü belirtin.

Sadece şeyiyle

, bu soru üzerine yorumları temel https://github.com/numpy/numpy/issues/9515 dosyalanmış DÜZENLEME. 2

DÜZENLEME Ve neredeyse immeditely kapattı.

+0

Hangi NumPy sürümdesiniz? Sonuç olarak dizi ([0, 1]) elde ediyorum. Ve bunun nedeni, "False" '0', -> 'x [0]' (1.11.3’de) olarak değerlendirilir. –

+1

@BradSolomon En son sürümde değiştirildi: https://docs.scipy.org/ doc/numpy-dev/release.html # boolean-indexing-changes (* Boolean'ın skaler dizilere indekslenmesi yeni bir 1-d dizisi döndürür. Bu, dizi (1) [dizi (True)] dizisi ([1]) verir demektir ve orijinal dizi değil. *) – ayhan

+0

@BradSolomon. 1.13.1, 'False', beklenen örneğimde gösterdiğim gibi bir boolean matrisinden geçmediğiniz sürece bir tamsayı olarak ele alınacaktır. Ben x [False] == x [0] ', 'x [np.array (False)] == x [0]' ile çok fazla değil. Ne de oluyor gibi görünüyor. –

cevap

7

Bir maskenin boyutunun, dizine eklediğiniz dizinin boyutsallığı ile eşleşmesi teknik olarak zorunlu değildir. (Önceki sürümlerinde, orada bile az kısıtlama vardı ve uzağa bazı aşırı şekil uyumsuzlukları ile alabilir.) Tek bir boolean endeks dizi x [ile pratik olarak aynıdır

olarak docs boolean indeksleme açıklayan

obj.nonzero()], yukarıda açıklandığı gibi, obj.nonzero(), objenin True öğelerini gösteren tamsayı dizisi dizilerinin bir tuple uzunluğunu (obj.ndim) döndürür.

ama nonzero 0 boyutlu girişi için garip, bu nedenle bu durum "pratik özdeş" olduğu yollarından biridir aynı değil olarak çıkıyor: Boolean diziler için

sıfırdan farklı denklik yok sıfır boyutlu boole dizileri için bekle.

In [3]: numpy.array(3)[True] 
Out[3]: array([3]) 

In [4]: numpy.array(3)[False] 
Out[4]: array([], dtype=int64) 

Ben kolları kaynak kodunda bir comment referans alırız:

NumPy aşağıdaki davranışa sahip yönündeki arzuya 0 boyutlu boole endeksi için özel bir durum vardır 0 boyutlu boolean endeksi: Bu da

if (PyArray_NDIM(arr) == 0) { 
    /* 
    * This can actually be well defined. A new axis is added, 
    * but at the same time no axis is "used". So if we have True, 
    * we add a new axis (a bit like with np.newaxis). If it is 
    * False, we add a new axis, but this axis has 0 entries. 
    */ 

öncelikle 0 boyutlu dizi için bir 0-boyutlu bir dizin için tasarlanmıştır, bu da boolean ile indeksleme boyutlu diziler için de geçerlidir.Dolayısı ile de,

x[True] 

önünde yeni uzunluğu-1 ekseni ile bir sonuç üreten x[np.newaxis] eşdeğerdir ve

x[False] 

uzunluğu 0, seçme önünde yeni eksenine sahip bir sonuç üretir elementler.

+0

Bu harika. Maskelerimi sadece np.array (mask, dtype = np.bool, copy = False, subok = True, ndmin = 1) 'kullanarak kontrol edeceğim. Bu "tuhaf" davranışı kaldırmalıdır. –

+0

Sorun çözüldü. –