说我有一个阵列x = np.arange(6).reshape(3, 2).
是什么意思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.
编辑2
并几乎立即关闭它.
从技术上讲,没有要求掩码的维度与您索引的数组的维度相匹配.(在以前的版本中,限制更少,你可以摆脱一些极端的形状不匹配.)
该文档描述布尔作为索引
单个布尔索引数组实际上与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)
Run Code Online (Sandbox Code Playgroud)
我将在源代码中引用一个处理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.
*/
Run Code Online (Sandbox Code Playgroud)
虽然这主要用于0维数组的0维索引,但它也适用于使用布尔值索引多维数组.从而,
x[True]
Run Code Online (Sandbox Code Playgroud)
相当于x[np.newaxis],在前面产生一个新的长度为1的轴,并且
x[False]
Run Code Online (Sandbox Code Playgroud)
在长度为0的前面生成一个新轴的结果,不选择任何元素.