gpt4 book ai didi

python - 对 einsum 中多个向量的外积求和

转载 作者:行者123 更新时间:2023-12-01 04:06:09 25 4
gpt4 key购买 nike

我已阅读 einsum manual和 ajcr 的 basic introduction

我在非编码环境中对爱因斯坦求和的经验为零,尽管我尝试通过一些互联网研究来弥补这一点(将提供链接,但还没有超过两个的声誉)。我还尝试在 python 中使用 einsum 进行实验,看看是否可以更好地处理事情。

但我仍然不清楚这样做是否可能且有效:

在长度 (3) 和高度 (n) 相等的两个数组数组(a 和 b)上,逐行生成 ( row i: a on b) 的外积加上 (row i: b on a),然后将所有外积矩阵相加以输出一个最终矩阵。

我知道“i,j->ij”产生一个向量与另一个向量的外积——接下来的步骤让我迷失了。 ('ijk,jik->ij'绝对不是它)

我的另一个可用选项是循环遍历数组并从我在 cython 中编写的函数调用基本函数(双外积和矩阵加法)(使用 numpy 内置的外函数和 sum 函数不是一个选项,它太慢了)。我很可能最终也会将循环本身移至 cython。

所以:

  1. 如何全面地表达我上面描述的过程?

  2. 与在 cython 中完成所有操作相比,它会带来真正的 yield 吗?或者还有其他我不知道的选择吗? (包括我使用 numpy 的效率低于我应有的可能性......)

谢谢。

<小时/>

编辑示例:

A=np.zeros((3,3))
arrays_1=np.array([[1,0,0],[1,2,3],[0,1,0],[3,2,1]])
arrays_2=np.array([[1,2,3],[0,1,0],[1,0,0],[3,2,1]])
for i in range(len(arrays_1)):
A=A+(np.outer(arrays_1[i], arrays_2[i])+np.outer(arrays_2[i],arrays_1[i]))

(但是请注意,实际上我们正在处理长度更大的数组(即每个内部成员的长度仍然为 3,但最多有几千个这样的成员),本节的代码(不可避免地)被调用多次)

如果它有帮助,这里是对两个外部产品求和的 cython:

def outer_product_sum(np.ndarray[DTYPE_t, ndim=1] a_in, np.ndarray[DTYPE_t, ndim=1] b_in):
cdef double *a = <double *>a_in.data
cdef double *b = <double *>b_in.data
return np.array([
[a[0]*b[0]+a[0]*b[0], a[0]*b[1]+a[1]*b[0], a[0] * b[2]+a[2] * b[0]],
[a[1]*b[0]+a[0]*b[1], a[1]*b[1]+a[1]*b[1], a[1] * b[2]+a[2] * b[1]],
[a[2]*b[0]+a[0]*b[2], a[2]*b[1]+a[1]*b[2], a[2] * b[2]+a[2] * b[2]]])

现在,我从“i in range(len(array))”循环中进行调用,如上所示。

最佳答案

爱因斯坦求和只能用于问题的乘法部分(即外积)。幸运的是,求和不必按元素执行,但您可以在约简矩阵上执行求和。使用示例中的数组:

arrays_1 = np.array([[1,0,0],[1,2,3],[0,1,0],[3,2,1]])
arrays_2 = np.array([[1,2,3],[0,1,0],[1,0,0],[3,2,1]])
A = np.einsum('ki,kj->ij', arrays_1, arrays_2) + np.einsum('ki,kj->ij', arrays_2, arrays_1)

输入数组的形状为 (4,3),求和在第一个索引(名为 'k')上进行。如果求和应在第二个索引上进行,请将下标字符串更改为 'ik,jk->ij'

关于python - 对 einsum 中多个向量的外积求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35549082/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com