如何计算矩阵每对向量的元素最小值之和

问题描述 投票:0回答:1

我有一个

(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 的元素求和。

python numpy matrix vectorization
1个回答
0
投票

要获取所有行对,您可以将

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]])
© www.soinside.com 2019 - 2024. All rights reserved.