【发布时间】:2021-11-04 14:33:43
【问题描述】:
我正在使用 numpy 计算两个数组的叉积,但遇到以下错误:
ValueError: non-broadcastable output operand with shape () doesn't match the broadcast shape (50,)
我有三个变量,它们是 numpy.ndarray 类型并代表行向量:
n = [0 0 1]beta = [array with 50 elements, 0, array with 50 elements]betap = [array with 50 elements, 0, array with 50 elements]
beta 的第一个和第三个元素代表以下分段函数的结果:
t_start = (-2 * 0.01) / 299792458
t_end = (3 * 0.01) / 299792458
t = np.linspace(t_start, t_end)
x_of_t = = np.piecewise(t,
[np.logical_or(t < t_start, t > t_end), np.logical_and(t_start <= t, t <= t_end)],
[((0.01 * 0.02) / (2 * np.pi * 2)), (lambda t: (0.01 * 0.02) / (2 * np.pi * 2) * np.cos((2 * np.pi)/0.01 * 299792458 * t))])
z_of_t = np.piecewise(t,
[t < t_start, t > t_end, np.logical_and(t_start <= t, t <= t_end)],
[(lambda t: (np.sqrt(0.75) * 299792458 * (t - t_start) + np.sqrt(0.75) * (1 - 0.02**2 / (4 * np.sqrt(0.75) * 2**2)) * 299792458 * t_start - 0.01 * 0.02**2 / (16 * np.pi * np.sqrt(0.75) * 2**2) * np.cos(2 * ((2 * np.pi)/0.01) * 299792458 * t_start))),
(lambda t: np.sqrt(0.75) * 299792458 * (t - t_end) + np.sqrt(0.75) * (1 - 0.02**2 / (4 * np.sqrt(0.75) * 2 **2)) * 299792458 * t_end - 0.01 * 0.02**2 / (16 * np.pi * np.sqrt(0.75) * 2 **2) * np.cos(2 * ((2 * np.pi)/0.01) * 299792458 * t_end)),
(lambda t: np.sqrt(0.75) * (1 - 0.02**2 / (4 * np.sqrt(0.75) * 2 **2)) * 299792458 * t - 0.01 * 0.02**2 / (16 * np.pi * np.sqrt(0.75) * 2**2) * np.cos(2 * ((2 * np.pi)/lambda_u) * 299792458 * t))])
betap 的第一个和第三个元素代表这些函数的导数。我正在使用 numpy 的梯度函数np.gradient(beta_x_of_t) 计算导数,因此数组长度将匹配(len = 50)。同样,在检查n、beta 和betap 的形状时,它们都具有相同的形状(3,)。检查beta 和betap 的第一个和第三个元素的形状会得到以下形状:(50,)。
鉴于形状相同,我认为我应该能够使用np.cross(n-beta, betap) 执行叉积,但出现上述错误。
我的目标是双重的:
- 了解错误消息的含义。例如,我查看了此处发布的许多其他问题,但似乎没有人回答输出操作数不可广播意味着什么。
- 使用该信息解决错误以计算叉积。
【问题讨论】:
-
如果您查看了许多其他问题,您肯定会看到 cmets 要求 traceback。你为什么不在这里提供?
-
n-beta和betap的shape和dtype是什么?这与np.cross的记录期望相比如何?显示生成这些对象的清晰代码。我为x_of_t等编码,以及对betap等的某种令人困惑的描述,但没有明确的可复制粘贴代码。
标签: python arrays numpy array-broadcasting cross-product