如何执行向量和矩阵乘法 其中 v 是向量 (v1, v2, v3),A 是 3x3 矩阵? Python 提示形状未对齐,可能是因为 v 是一个 ndarray。关于如何进行此操作有什么想法吗?最终结果应该是每个坐标点(v1,v2,v3)的标量。下面的基本代码在尝试进行乘法时会中断。
import numpy as np
a = np.linspace(0, 10, 21)
b = np.linspace(0, 20, 41)
a, b = np.meshgrid(a,b)
v = np.array([a*b, a+b, a])
A = np.ones([3,3])
s = v.T @ A @ v # doesn't work
错误
----> 1 s = v.T @ A @ v
ValueError: shapes (21,41,3) and (3,41,21) not aligned: 3 (dim 2) != 41 (dim 1)
编辑:矩阵运算应该在每个点v完成,其中v通常是一个大数组(向量)。例如,取一个中心位于原点的 1m 立方体,并在每个网格点(例如每个坐标轴上每 10cm)评估矩阵运算。
编辑 2 (x,y,z) 处单个点的示例
A = np.zeros([3,3])
A[0][0] = 1
A[1][1] = 2
A[2][2] = 3
x,y,z = 1, 1, 0
v = np.array([x, y, z])
s = v.T @ A @ v # should give s=3
下一步是让代码适用于大量向量v。只是它有点复杂,因为矢量坐标 (x,y,z) 需要根据坐标 (a,b) 进行参数化。上面的原始代码尝试做到这一点,但不起作用,并且可能不是最好的方法。还有其他想法吗?
最佳答案
通过提到三个元素的向量 v
,您的意思似乎是一个沿其第一个轴具有三个元素的 ndarray,每个元素保存一个 n 维数组数据。对于列出的示例,您拥有与 3D 数组相同的内容。
对于三个元素的向量中的每一个,输出似乎都被简化为标量,即输出将是二维的。
因此,为了解决您的情况,我们需要对第一个轴使用张量乘法:V.T @ A
对第一个轴进行求和,得到一个 3D 数组。然后,使用einsum
保持前两个轴对齐并对最后一个轴求和,就像这样 -
p1 = np.tensordot(v,A,axes=((0,0)))
out = np.einsum('jkl,ljk->jk',p1,v)
或者,使用 einsum
我们可以一步完成所有操作,就像这样 -
out = np.einsum('ijk,il,ljk->jk',v,A,v)
我们可以使用einsum's
可选参数使其更快:optimize
设置为True
:
np.einsum(..., optimize=True)
关于python - 与 ndarray 的矩阵乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51040326/