玩具示例
我有两个具有不同形状的数组,例如:
import numpy as np
matrix = np.arange(5*6*7*8).reshape(5, 6, 7, 8)
vector = np.arange(1, 20, 2)
Run Code Online (Sandbox Code Playgroud)
我想要做的是将矩阵的每个元素乘以“向量”的元素之一,然后在最后两个轴上求和。为此,我有一个与“矩阵”形状相同的数组,它告诉我要使用哪个索引,例如:
Idx = (matrix+np.random.randint(0, vector.size, size=matrix.shape))%vector.size
Run Code Online (Sandbox Code Playgroud)
我知道解决方案之一是:
matVec = vector[Idx]
res = np.sum(matrix*matVec, axis=(2, 3))
Run Code Online (Sandbox Code Playgroud)
甚至:
res = np.einsum('ijkl, ijkl -> ij', matrix, matVec)
Run Code Online (Sandbox Code Playgroud)
问题
然而,我的问题是我的数组很大,并且 matVec 的构建既需要时间又需要内存。那么有没有办法绕过这个并仍然达到相同的结果呢?
更现实的例子
这是我实际做的一个更现实的例子:
import numpy as np
order = 20
dim = 23
listOrder = np.arange(-order, order+1, 1)
N, P = np.meshgrid(listOrder, listOrder)
K = np.arange(-2*dim+1, 2*dim+1, 1)
X = np.arange(-2*dim, 2*dim, 1)
tN = np.einsum('..., …Run Code Online (Sandbox Code Playgroud) python arrays numpy matrix-multiplication elementwise-operations