例如,我有matrix=np.array([[1,2],[3,4]])
。
當我在Numpy中使用布爾過濾時,比如:matrix[[True,False]]
,我理解它是如何工作的——我會得到第一行。但是當我使用類似于:matrix[True, False]
的東西時,我得到的是空括號。我想,在這種情況下,布爾值意味著我想使用哪個維度,因為如果我寫:matrix[True, True]
,那么我會得到整個矩陣,但如果我使用:matrix[True, True, False]
,那么即使我有一個二維數組,我也會得到空括號。
這實際上是如何工作的?
這是一個非常奇怪的案例。事實上,它已經過測試,但我不認為這種行為在任何地方都有記錄。
如果你用任何數字
True
scalars對數組進行索引,結果相當于arr[np.newaxis]
:它包含了原始數組的所有數據,但額外增加了一個length- 1軸位于其形狀的起點。如果你用任意數量的布爾值scalars對數組進行索引,其中至少有一個是
False
,你會得到一個空結果。結果具有原始數組的形狀,但有一個額外的length- 0軸位于形狀的開始處。布爾索引的正常情況是索引數組和原始數組具有相同的形狀。在正常情況下,所需的行為是生成一個1D數組,其中包含與索引數組中的
True
個單元格對應的原始數組的所有元素。對于>=1D布爾索引arrays,這相當于用
index.nonzero()
代替索引數組。但是nonzero()
對于0D arrays來說有點奇怪。相反,0D布爾arraylikes(包括普通布爾scalars)具有特殊處理。代碼中的注釋描述了特殊處理,如下所示:
當你用一個布爾值scalar索引對數組進行索引時,注釋準確地描述了行為。特別是,它在激勵特殊處理的情況下做了正確的事情:
array(5.0)[True]
產生array([5.0])
,array(5.0)[False]
產生scalars。但對于兩個scalar布爾索引,其行為與注釋并不完全一致。閱讀注釋時,您會期望每個注釋都向輸出中添加一個新軸,因此,如果數組
arr
的形狀為(x, y)
,您會希望arr[True, False]
得到形狀為scalars的(空)輸出。但事實并非如此。發生的事情就是我在答案的第一部分所描述的。這是因為該實現沒有為0D布爾索引添加多個軸的處理。它可以對
np.newaxis
執行此操作,但對0D布爾索引沒有處理。相反,它設置了一個變量來添加至少一個“花哨的索引”維度:然后,對于每個布爾值scalar索引,它將最后一個“花式索引”維度的長度乘以1(對于
True
),或乘以0(對于False
):這種處理的動機是與廣播的類比——就好像我們在廣播形狀為
(1,)
或(0,)
的arrays的花哨索引維度。事實上,代碼實際上創建了那些shape-(1,)
或shape-(0,)
arrays,盡管我認為它對它們的內容沒有任何作用——這些值不用于索引。如果發生廣播失敗,這些arrays用于錯誤消息,我認為它們在以后創建內部迭代器時被用作虛擬對象。這種處理也意味著,如果你將布爾值scalars與其他形式的“花哨索引”(如整數arrays)結合使用,你會看到其他奇怪的行為。例如,如果我們有以下arrays:
那么
arr[index]
將產生一個2-by- 2其元素為arr[1]
、arr[2]
、{@160}和arr[3]
的數組。但如果我們這樣做
arr[index, True]
或arr[index, False]
:arr[index, True]
的形狀與arr[index]
相同,而arr[index, False]
會導致廣播失敗。