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

evrscar2  于 2024-01-08  发布在  其他
关注(0)|答案(1)|浏览(117)

我有一个(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。然后,可以使用它来索引数组以获取行对,执行元素最小值,将其求和,并将其整形为所需的平方。

  1. import numpy as np
  2. from itertools import product
  3. arr = np.arange(20).reshape(4,5)
  4. perms = np.array(list(product(range(arr.shape[0]), repeat=2)))
  5. minimums = np.minimum(arr[perms[:,0]], arr[perms[:,1]])
  6. res = minimums.sum(1).reshape(arr.shape[0], arr.shape[0])

字符串
测试结果:

  1. array([[10, 10, 10, 10],
  2. [10, 35, 35, 35],
  3. [10, 35, 60, 60],
  4. [10, 35, 60, 85]])


中间体:

  1. # arr
  2. array([[ 0, 1, 2, 3, 4],
  3. [ 5, 6, 7, 8, 9],
  4. [10, 11, 12, 13, 14],
  5. [15, 16, 17, 18, 19]])
  6. # perms
  7. array([[0, 0],
  8. [0, 1],
  9. [0, 2],
  10. [0, 3],
  11. [1, 0],
  12. [1, 1],
  13. [1, 2],
  14. [1, 3],
  15. [2, 0],
  16. [2, 1],
  17. [2, 2],
  18. [2, 3],
  19. [3, 0],
  20. [3, 1],
  21. [3, 2],
  22. [3, 3]])
  23. # minimums
  24. array([[ 0, 1, 2, 3, 4],
  25. [ 0, 1, 2, 3, 4],
  26. [ 0, 1, 2, 3, 4],
  27. [ 0, 1, 2, 3, 4],
  28. [ 0, 1, 2, 3, 4],
  29. [ 5, 6, 7, 8, 9],
  30. [ 5, 6, 7, 8, 9],
  31. [ 5, 6, 7, 8, 9],
  32. [ 0, 1, 2, 3, 4],
  33. [ 5, 6, 7, 8, 9],
  34. [10, 11, 12, 13, 14],
  35. [10, 11, 12, 13, 14],
  36. [ 0, 1, 2, 3, 4],
  37. [ 5, 6, 7, 8, 9],
  38. [10, 11, 12, 13, 14],
  39. [15, 16, 17, 18, 19]])
  40. # minimums.sum(1)
  41. array([10, 10, 10, 10, 10, 35, 35, 35, 10, 35, 60, 60, 10, 35, 60, 85])

展开查看全部

相关问题