【问题标题】:Multiply every matrix of a numpy array with the transpose of every other efficiently将 numpy 数组的每个矩阵与其他每个矩阵的转置有效地相乘
【发布时间】:2019-06-02 10:17:22
【问题描述】:

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

【问题讨论】:

  • v.idx() 呢?
  • 我们正在迭代顶点,v.idx() 表示相应的索引。
  • 如果您生成一些样本数据以便检查结果,这会容易得多
  • @yatu 好的,我把代码 sn-p 改成了等价的问题。
  • r 的形状是什么?

标签: python loops numpy


【解决方案1】:

假设您希望 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

【讨论】:

  • 糟糕,我在重命名变量时没有注意到错误。尽管如此,你仍然按照我想要理解的方式理解它。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2019-11-15
  • 2020-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多