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

Mad*_*ist 9 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)].

这种行为对一致的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

并几乎立即关闭它.

use*_*ica 7

从技术上讲,没有要求掩码的维度与您索引的数组的维度相匹配.(在以前的版本中,限制更少,你可以摆脱一些极端的形状不匹配.)

文档描述布尔作为索引

单个布尔索引数组实际上与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的前面生成一个新轴的结果,不选择任何元素.