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

evrscar2  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(105)

我有一个(n, m)矩阵M,由n向量组成,长度为m
我想计算一个维度为(n, n)的矩阵K,其中在位置(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的元素求和。

o8x7eapl

o8x7eapl1#

要获取所有行对,可以使用itertools.productrepeat=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]])


中间体:

# arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

# perms
array([[0, 0],
       [0, 1],
       [0, 2],
       [0, 3],
       [1, 0],
       [1, 1],
       [1, 2],
       [1, 3],
       [2, 0],
       [2, 1],
       [2, 2],
       [2, 3],
       [3, 0],
       [3, 1],
       [3, 2],
       [3, 3]])

# minimums
array([[ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [ 5,  6,  7,  8,  9],
       [ 5,  6,  7,  8,  9],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [10, 11, 12, 13, 14],
       [ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

# minimums.sum(1)
array([10, 10, 10, 10, 10, 35, 35, 35, 10, 35, 60, 60, 10, 35, 60, 85])

相关问题