什么`x [False]`在numpy中做什么?

时间:2017-08-03 19:44:37

标签: python numpy

说我有一个数组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

几乎立即关闭了它。

1 个答案:

答案 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的前面生成一个新轴,不选择任何元素。