我有一个
(n, m)
矩阵 M
由 n
长度为 m
的向量组成。
我想计算一个维度为
K
的矩阵 (n, n)
,其中位置 (i, j)
是原始向量 i
和向量 j
之间的逐元素最小向量之和。
因此,例如,如果矩阵
M
的向量 i
等于 [ 2, 5, 4 ]
并且向量 j
等于 [ 3, 1, 6 ]
,则逐元素最小向量为 [ 2, 1, 4 ]
,并且这个向量是7
。因此,在矩阵 K
中,位置 (i, j)
必须有 7
。
当然,使用 for 循环执行此操作并不困难,但我想仅使用 NumPy
的矢量化运算来计算
K
,因为矩阵 M
很大并且使用循环等标准操作非常慢.
有人可以帮助我吗?
我已经尝试使用
np.minimum.outer(M)
,它输出一个 (n, m, n, m)
矩阵 Z
,其中 (i, j, k, l)
中的值是原始矩阵中值 M(i, j)
和 M(k, l)
之间的最小值,因此计算每个值M
与 M
中的所有元素相比,该值之间具有最小值的矩阵。
问题是我仍然没有弄清楚如何使用 NumPy 运算正确地对 Z 的元素求和。
要获取所有行对,您可以将
itertools.product
与 repeat=2
一起使用。然后,您可以使用它来索引数组,获取行对,对其执行最小值,求和,然后重新整形为您想要的正方形。
import numpy as np
from itertools import product
arr = np.arange(20).reshape(4,5)
perms = np.array(list(product(range(arr.shape[0]), repeat=2)))
minimums = np.minimum(arr[perms[:,0]], arr[perms[:,1]])
res = minimums.sum(1).reshape(arr.shape[0], arr.shape[0])
array([[10, 10, 10, 10],
[10, 35, 35, 35],
[10, 35, 60, 60],
[10, 35, 60, 85]])