尺寸与numpy广播不匹配

时间:2017-11-03 12:10:18

标签: python numpy numpy-broadcasting

我遇到了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

感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

您需要将两者都延伸到3D,保持第一个轴对齐,并在points的最后一个轴上引入新轴,为L1引入第二个轴,然后减去 -

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