高效地将numpy数组的每个矩阵与其他矩阵的转置相乘

时间:2019-06-01 12:44:53

标签: python loops numpy

给出一个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)

1 个答案:

答案 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