小编Gör*_*örg的帖子

如何在特定索引处将两个数组相乘?

玩具示例

我有两个具有不同形状的数组,例如:

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

4
推荐指数
1
解决办法
296
查看次数