python - 与 ndarray 的矩阵乘法

标签 python arrays numpy matrix linear-algebra

如何执行向量和矩阵乘法 equation其中 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/

相关文章:

python - django自定义模板标签-导入模型博客报错

python - 返回列表的子组合

python - 如何轻松地将 numpy.ndarray 转换为 numpy.array 列表?

python Pandas : remove duplicates row in each seperate section

python - 使用 numpys loadtxt 在具有不同名称的数组中循环加载许多文本文件

c - 算法(!=线性搜索)在整数数组中查找第一个小于 X 的数字

arrays - 如何通过将数据保存为 NsUserDefaults 中的数组来记住游戏状态

c - 全局数组问题不更新,C 编程

.net - IronPython 无法运行导入 numpy 的脚本

python - numpy 中的递归减法