说我有一个数组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)]
。
<{1}}和x[True]
的此行为 一致,因为两者都会产生额外维度:x[np.asanyarray(True)]
。
我正在使用numpy 1.13.1。最近似乎行为发生了变化,所以虽然对旧版本的答案很有帮助,但请在答案中提及您的版本。
修改
为了完整起见,我根据对此问题的评论提交了https://github.com/numpy/numpy/issues/9515。
编辑2
几乎立即关闭了它。
答案 0 :(得分:7)
从技术上讲,没有要求掩码的维度与您索引的数组的维度相匹配。 (在以前的版本中,限制更少,你可以摆脱一些极端的形状不匹配。)
docs将布尔索引描述为
单个布尔索引数组实际上与x [obj.nonzero()]相同,其中,如上所述,obj.nonzero()返回整数索引数组的元组(长度为obj.ndim),显示True元素物镜。
但是nonzero
对于0维输入来说很奇怪,所以这种情况是&#34;实际上相同的方式之一&#34;结果不一样:
布尔数组的非零等价不适用于零维布尔数组。
NumPy有一个0维布尔索引的特例,其动机是希望有以下行为:
In [3]: numpy.array(3)[True]
Out[3]: array([3])
In [4]: numpy.array(3)[False]
Out[4]: array([], dtype=int64)
我将在源代码中引用一个处理0维布尔索引的comment:
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的前面生成一个新轴,不选择任何元素。