【问题标题】:What does `x[False]` do in numpy?`x[False]` 在 numpy 中有什么作用?
【发布时间】:2017-08-03 19:44:36
【问题描述】:

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

并且几乎立即关闭它。

【问题讨论】:

  • 您使用的是哪个 NumPy 版本?结果我得到array([0, 1])。这是因为False 被视为0,--> x[0](在 1.11.3 中)
  • @BradSolomon 在上一个版本中进行了更改:docs.scipy.org/doc/numpy-dev/… (标量数组的布尔索引返回一个新的一维数组。这意味着 array(1)[array(True) ] 给出 array([1]) 而不是原始数组。)
  • @BradSolomon。版本 1.13.1,False 将被视为整数,除非您传入一个布尔矩阵,如我在预期示例中所示。我对x[False] == x[0] 的想法很满意,但对x[np.array(False)] == x[0] 不太满意。似乎都没有发生。
  • @ayhan:不,这是不同的变化。
  • @ayhan:这里的相关部分比你引用的部分高一点:“布尔标量(包括python True)是合法的布尔索引,从不被视为整数。”

标签: python numpy


【解决方案1】:

从技术上讲,掩码的维度与您使用它索引的数组的维度不匹配。 (在以前的版本中,限制更少,您可以避免一些极端的形状不匹配。)

docs 将布尔索引描述为

单个布尔索引数组实际上与 x[obj.nonzero()] 相同,其中,如上所述,obj.nonzero() 返回整数索引数组的元组(长度为 obj.ndim),显示对象。

但是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)

我将在处理 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],产生一个前面有一个新的length-1轴的结果,并且

x[False]

在长度为 0 的前面生成一个新轴,不选择任何元素。

【讨论】:

  • 这很棒。我将使用np.array(mask, dtype=np.bool, copy=False, subok=True, ndmin=1) 检查我的口罩。这应该消除“奇怪”的行为。
  • 关闭问题。
猜你喜欢
  • 1970-01-01
  • 2018-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 2016-07-16
相关资源
最近更新 更多