【问题标题】:Why the following operands could not be broadcasted together?为什么下面的操作数不能一起广播?
【发布时间】:2018-06-08 10:03:46
【问题描述】:

数组具有以下维度: dists: (500,5000) train: (5000,) test:(500,)

为什么前两个语句会抛出错误,而第三个却可以正常工作?

  1. dists += train + test

错误:ValueError: operands could not be broadcast together with shapes (5000,) (500,)

  1. dists += train.reshape(-1,1) + test.reshape(-1,1)

错误:ValueError: operands could not be broadcast together with shapes (5000,1) (500,1)

  1. dists += train + test.reshape(-1,1) 这很好用!

为什么会这样?

【问题讨论】:

    标签: python python-3.x numpy array-broadcasting


    【解决方案1】:

    这与 NumPy 的广播规则有关。引用 NumPy 手册:

    当对两个数组进行操作时,NumPy 会逐元素比较它们的形状。它从尾随维度开始,然后向前推进。两个维度兼容时

    1. 它们是相等的,或者
    2. 其中一个是 1

    第一个语句抛出错误,因为 NumPy 只看维度,(5000,)(500,) 不相等,不能一起广播。

    在第二个语句中,train.reshape(-1,1) 的形状为 (5000,1)test.reshape(-1,1) 的形状为 (500,1)。尾随维度(长度一)相等,所以没关系,但是 NumPy 会检查另一个维度和5000 != 500,所以广播在这里失败。

    在第三种情况下,您的操作数是(5000,)(500,1)。在这种情况下,NumPy 确实 允许广播。一维数组沿二维数组的尾随长度为 1 维扩展。

    FWIW,形状和广播规则有时会有点棘手,我经常被类似的事情弄糊涂。

    【讨论】:

    • 是不是因为两个都是1所以需要检查是否相等,而只有一个是1时不需要检查是否相等?
    • 它需要检查每个维度的兼容性。在第二种情况下,1 和 1 兼容,但 5000 和 500 不兼容。在第三种情况下 5000 和 1 是兼容的,没有更多的维度要检查。
    猜你喜欢
    • 2019-04-20
    • 2021-03-03
    • 1970-01-01
    • 1970-01-01
    • 2019-06-21
    • 2021-07-19
    • 2020-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多