2016-01-19 16 views
10
Şimdi
two_d = np.array([[ 0, 1, 2, 3, 4], 
        [ 5, 6, 7, 8, 9], 
        [10, 11, 12, 13, 14], 
        [15, 16, 17, 18, 19], 
        [20, 21, 22, 23, 24]]) 

first = np.array((True, True, False, False, False)) 
second = np.array((False, False, False, True, True)) 

, bir 2D np.array dizine eklerken:Beklenmeyen davranış ben girmek iki boolean diziler

two_d[first, second] 

alıyorum:

array([3,9]) 

bir sürü yapmaz ki bana duyu. Bunu açıklayan var mı?

cevap

8

Sayısallaştırılacak birden çok boole dizisi verildiğinde, NumPy True değerlerinin dizinlerini eşler. first'daki ilk gerçek değer, second'daki ilk gerçek değerle eşleştirilir ve bu şekilde devam eder. NumPy daha sonra bu (x, y) indislerinin her birinde öğeleri getirir.

Bu two_d[first, second] eşdeğer olduğu anlamına gelir: Bir başka deyişle dizine de değerlerin çekilmesi konum olarak

two_d[[0, 1], [3, 4]] 

(0, 3) ve indeks (1, 4); 3 ve 9. İki dizinin farklı sayılarda gerçek değerlere sahip olmasının bir hata ortaya çıkacağını unutmayın! En iyi obj.nonzero() benzetme ile anlaşılabilir bir tamsayı indeksleme dizisi ile birden Boole indeksleme dizileri veya Boole birleştiren

:

bu davranış kısaca documents on advanced indexing söz ve 'daha az şaşırtıcı' alternatif olarak np.ix_ düşündürmektedir. ix_ işlevi de boole dizilerini destekler ve herhangi bir sürpriz olmadan çalışır.

Dolayısıyla aradığınız edilebilir:

>>> two_d[np.ix_(first, second)] 
array([[3, 4], 
     [8, 9]]) 
+0

, almak istediğimi varsaymak için iki_d [ilk] .T [saniye] .T – pixelbrei

+0

@ Pixelbrei: Evet, burada çalışabilir, çünkü dokümanlar 'np.ix_' kullanılmasını önerir. İstediğiniz sonucu al. –

+0

@ajcr Harika, teşekkürler! – user3763302

1

kontrol documentation on boolean indexing.

two_d[first, second]


two_d[first.nonzero(), second.nonzero()], aynıdır: Bu 3 seçecektir

>>> first.nonzero() 
(array([0, 1]),) 
>>> second.nonzero() 
(array([3, 4]),) 

endeksleri olarak kullanılır, ve 9

>>> two_d[0,3] 
3 
>>> two_d[1,4] 
9 

ve

Ayrıca
>>> two_d[[0,1],[3,4]] 
array([3, 9]) 

mildy ilgili çünkü : NumPy indexing using List?

İlgili konular