【问题标题】:einstein summation of boolean arrays in numpynumpy中布尔数组的爱因斯坦求和
【发布时间】:2019-11-08 07:21:00
【问题描述】:

numpy 中布尔数组的爱因斯坦求和 (numpy.einsum) 不会产生预期结果。 Numpy.einsum 函数对布尔数组进行逻辑运算,这在数值上下文中是有问题的。

# summation of a boolean numpy array

x = numpy.array([True, False, True])

print(numpy.sum(x))
# output: 2

print(numpy.einsum('i->', x))
# output: True

对于一个布尔数组 x = [True, False, True],我希望 x 的和为 2,结果不应该取决于函数的特定选择。但是,numpy.sum 给出了 2,而 numpy.einsum 给出了 True。

我不确定是我误解了什么还是我的代码有问题。任何帮助表示赞赏。

【问题讨论】:

  • 布尔数组上的“总和”应该产生数字结果对我来说并不明显。逻辑和/对我来说同样有意义,也许更多。 x@np.array([True,True,True]) 也会产生一个布尔值 True
  • 这是我对出现在 python 文档中的一句话的解释,它说“在数字上下文中(例如,当用作算术运算符的参数时),它们的行为分别类似于整数 0 和 1 。” (链接docs.python.org/3.7/library/stdtypes.html)。我不是 100% 确定“数字上下文”的确切含义。不确定以下情况是否可以算作数字上下文np.array([True, False])**np.array([True])np.array([True, False])/np.array([True])np.array([True, False])*np.array([True])。我觉得这个问题太主观了

标签: numpy boolean-operations numpy-einsum


【解决方案1】:

这里的区别在于sum 在求和之前将boolean 转换为整数,而einsum 会跳过这一步,除非您明确指定。

试试:

print(numpy.einsum('i->', x, dtype=int))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 2016-12-20
    • 1970-01-01
    • 1970-01-01
    • 2021-02-21
    • 2016-08-17
    相关资源
    最近更新 更多