给出一个numpy数组M
,我想计算该数组的矩阵的每2个组合的矩阵乘积M[i] @ M[j].T
。在对该矩阵(产品)进行了一些操作之后,我想将结果存储在位置[i,j]
的另一个矩阵中。有没有一种方法可以快速地计算出这个值,而无需迭代两个嵌套循环?
即我要避免的(因为要花几个小时)是:
import numpy as np
M = np.random.rand(7000,3,3)
r = np.zeros((len(M), len(M)))
for i in range(len(r)):
for j in range(len(r[0])):
n = M[i] @ M[j].T
r[i,j] = np.linalg.norm(n)
答案 0 :(得分:2)
假设您希望r
的形状为(M.shape[0],M.shape[0])
。
M = np.random.rand(700,3,3)
t = M.shape[0]
r = np.zeros((t, t))
这等效于内循环的第一条语句
q = M[:,None,...] @ M.swapaxes(1,2)
这完成了内部/外部循环
p = np.linalg.norm(q, axis=(2,3))
for i in range(len(r)):
for j in range(len(r[0])):
n = M[i] @ M[j].T
r[i,j] = np.linalg.norm(n)
>>> np.all(np.isclose(p,r))
True
使用M.shape -> (70,3,3)
,它比for循环快42倍。
使用M.shape -> (700,3,3)
,它比for循环快36倍。
我可怜的计算机无法处理M.shape --> (7000,3,3)
... MemoryError
。