【问题标题】:Dimension mismatch with numpy broadcasting与 numpy 广播的维度不匹配
【发布时间】:2017-11-03 12:10:18
【问题描述】:

我在使用 numpy 广播时遇到问题。当我尝试进行矩阵-矩阵乘法时,出现以下错误:

"操作数不能和形状一起广播 (2,6) (2,7)"

这是无法运行的代码:

import numpy as np

pointsX = np.array([0.5, 2, 3, 5.5, 8, 11])
pointsY = np.array([1, 2, -1.5, 0.5, 4, 5])
points = np.asarray([pointsX, pointsY])

linesX = np.array([0, 2, 4, 6, 10, 10, 0, 0])
linesY = np.array([0, 0, 0, 0, 0, 4, 4, 0])
lines = np.asarray([linesX, linesY])

x1 = linesX[0:-1]
y1 = linesY[0:-1]
L1 = np.asarray([x1, y1])

# calculate the relative length of the projection
# of each point onto each line
a = [np.diff(pointsX), np.diff(pointsY)]
b = points - L1
relativeProjectionLength = np.dot(a, b)/np.linalg.norm(b)

当我尝试计算 b 时出现问题。我希望它是一个 [2x6x7] 矩阵。如何执行此操作?我可以尝试使用循环,但实际数据会非常大(~10000 点和~10000 行)并且必须是高性能的。

我读到了关于扩展其中一个运算符(点或 L1)的维度,但以下代码也不能解决问题:

b = points - L1[:,:,None]
b = points[:,:,None] - L1

感谢任何帮助。

【问题讨论】:

    标签: python numpy array-broadcasting


    【解决方案1】:

    您需要将两者都扩展到3D,保持第一个轴对齐,并为points 沿最后一个轴引入新轴,为L1 引入倒数第二个轴,然后减去 -

    points[:,:,None] - L1[:,None,:] # or points[...,None] - L1[:,None]
    

    【讨论】:

    • 解决了这个问题。现在我什至更好地理解了官方 numpy 广播页面的示例。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 2017-12-31
    • 2014-12-21
    • 2016-03-24
    • 1970-01-01
    相关资源
    最近更新 更多