2017-08-03 89 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

已解决问题。 –