2017-08-03 70 views
9

說我有一個陣列x = np.arange(6).reshape(3, 2)`x [False]`在numpy中做什麼?

什麼意思是x[False]的意思,或x[np.asanyarray(False)]?兩者都導致array([], shape=(0, 3, 2), dtype=int64),這是意想不到的。

由於尺寸大小不正確,我預計會得到一個IndexError,如x[np.ones((2, 2), dtype=np.bool)]

這種行爲一致爲x[True]x[np.asanyarray(True)],既導致額外的維度:array([[[0, 1], [2, 3], [4, 5]]])

我正在使用numpy 1.13.1。看來最近的行爲已經發生了變化,所以雖然很高興爲舊版本提供答案,但請在答案中提及您的版本。

編輯

只是爲了保持完整性,我基於對這個問題進行評論提交https://github.com/numpy/numpy/issues/9515

EDIT 2

和關閉它幾乎immeditely。

+0

你在用什麼NumPy版本?結果,我得到'array([0,1])'。這是因爲'False'被視爲'0', - >'x [0]'(在1.11.3中) –

+1

@BradSolomon它在最後一個版本中被更改:https://docs.scipy.org/ (1)[array(True)]給出了數組([1]),這個數組是一個數組,而不是原始數組。*) – ayhan

+0

@BradSolomon。版本1.13.1,除非您傳入布爾矩陣,否則'False'將被視爲整數,正如我在預期的示例中所示。我對'x [False] == x [0]'的想法很好,但對於'x [np.array(False)] == x [0]'沒有那麼多'。這兩者似乎都沒有發生。 –

回答

7

技術上沒有要求掩碼的維度與您使用它索引的數組的維度匹配。 (在以前的版本中,有更少的限制,你可以擺脫一些極端的形狀不匹配。)

docs描述布爾索引作爲

一個布爾指數陣列實際上與X [ obj.nonzero()]其中,如上所述,obj.nonzero()返回一個整數索引數組的元組(長度爲obj.ndim),其中顯示了obj的True元素。

nonzero是奇怪的0維輸入,所以這種情況下是一種方法即「幾乎相同」一個結果是不相同的:

非零等價布爾陣列不保持零維布爾數組。

NumPy的有0維布爾指數特殊的情況下,有以下行爲的願望所驅使:

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

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

我將把在處理一個源代碼comment 0維布爾指數:

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. 
    */ 

雖然這是主要用於一個0維索引爲0維陣列,它也適用於與布爾索引多維數組。因此,

x[True] 

相當於x[np.newaxis],產生結果與前面一個新的長度爲1的軸,和

x[False] 

在長度爲0,在選擇的前面產生的結果與新的軸線沒有元素。

+0

這太棒了。我將使用'np.array(mask,dtype = np.bool,copy = False,subok = True,ndmin = 1)'來檢查我的掩碼。這應該消除「怪異」的行爲。 –

+0

已解決問題。 –

相關問題