【问题标题】:Index of True and False of a numpy arraynumpy数组的真假索引
【发布时间】:2019-09-27 08:51:52
【问题描述】:

代码

import numpy as np    
a = np.arange(5)   
print(a[True])    
print(a[False])

结果

[[0 1 2 3 4]]
[]

对于上面的代码,当我将 True 传递给 numpy 数组的索引时,它返回完整的数组,而 False 则返回一个空数组。背景发生了什么?

【问题讨论】:

  • 能否请您仔细检查您的第一个打印语句的输出?是[0,1,2,3,4] 还是[[0,1,2,3,4]]
  • 是[[0 1 2 3 4]]

标签: python-3.x numpy


【解决方案1】:

您的示例---将标量或 0D---布尔掩码应用于一维数组会产生

print(a[True])
# [[0 1 2 3 4]]
print(a[False])
# []

为了清楚起见,尤其是 w.r.t.第二个(False)案例让我们查询形状

print(a[True].shape)
# (1, 5)
print(a[False].shape)
# (0, 5)

现在乍一看有点令人费解。为什么是额外维度?

让我们从一个不太前卫的案例开始,弄清楚为什么这是合乎逻辑的行为:

x = np.arange(6).reshape(3,2)
m2 = np.array([[True,False],[True,True],[False,True]])
m1 = np.array([True,False,True])
m0 = np.array(True)

我们创建了一个 2D 数组并匹配 2D、1D 和 0D 掩码。

使用 2D 蒙版进行蒙版会产生 1D 结果

x[m2]
# array([0, 2, 3, 5])

使用 1D 掩码进行掩码会选择整行,因此会给出 2D 结果

x[m1]
# array([[0, 1],
#        [4, 5]])

我们也可以在更高的维度上验证,从掩码中删除一个维度会使结果增加一。

因此,使用 0D 进行掩码确实比我们开始时多获得一维是合乎逻辑的。 2D 掩码选择单个点(0D -> 这些点的列表:1D),1D 掩码选择整行(1D -> 这些点的列表:2D);因此,0D 蒙版应该并且确实会选择整个工作表(2D -> 列表:3D);因为基本数组是 2D 的,所以一张表就是它的全部。

x[m0]
# array([[[0, 1],
#         [2, 3],
#         [4, 5]]])

x[m0].ndim
# 3

一般:

x[m2].ndim == x.ndim - m2.ndim + 1
# True 
x[m1].ndim == x.ndim - m1.ndim + 1
# True
x[m0].ndim == x.ndim - m0.ndim + 1
# True

【讨论】:

  • 精美呈现!我看到了逻辑,而且维度 >= 1(数组和掩码)对我来说也很有意义,但是如果 1D 被零维屏蔽,为什么增加维度有用
  • @MrFuppes 根据我的经验,这种一致的行为是最容易使用的。例如,如果您正在编写一些想要处理各种维度的代码,您可能需要能够预测中间结果的属性。在这种情况下,能够依赖于答案末尾的公式并且不必为 0D 蒙版创建额外的分支会派上用场。
【解决方案2】:

a 是您的 numpy 数组,即 [0,1,2,3,4] 您应该设置条件 如果满足条件,则在索引上,如果满足,它将返回该元素 然后不要丢弃那些元素。在这里你把 True 这意味着 每个元素都满足这个条件,如果 False 则不满足元素。检查此部分

Boolean or “mask” index arrays

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多