具有矩阵输出的一维数组的成对计算

时间:2019-10-22 15:42:07

标签: numpy numpy-ndarray

假设您具有以下一维数组:

array([1,2,3,4,5])

我想在每个数字组合(例如加法,减法等)之间执行不同(简单)的计算,从而得出矩阵类型的输出(不重复),即对于上述数组,输出应为如果我们想计算成对差异,则如下所示:

array([0,-,-,-,-],            
      [1,0,-,-,-],
      [2,1,0,-,-],
      [3,2,1,0,-],
      [4,3,2,1,0]) 

当然可以用蛮力将两个for循环一起使用,但我觉得有更好的方法,我似乎找不到正确的方法。

2 个答案:

答案 0 :(得分:1)

利用numpy广播计算成对差异。这样就不需要循环。为此,必须在同一数组的行向量和列向量之间进行操作。

import numpy as np
x = np.arange(1,6, dtype=np.float)

# x[:,None] adds a second axis to the array
mat = x[:,None]-x

这将产生:

array([[ 0., -1., -2., -3., -4.],
       [ 1.,  0., -1., -2., -3.],
       [ 2.,  1.,  0., -1., -2.],
       [ 3.,  2.,  1.,  0., -1.],
       [ 4.,  3.,  2.,  1.,  0.]])

答案 1 :(得分:0)

对于感兴趣的人,我设法使用了scikit-learn的pairwise_distances找到了解决方案。默认情况下,这将只计算任何一对之间的绝对距离,但是可以提供一个自定义函数,该函数带有两个参数,即一对中的两个数字,以进行更精细的计算。一维阵列将需要稍作调整。

from sklearn.metrics import pairwise_distances

def custom_calc(x,y):
    return (y-x)

a = np.array([1,2,3,4,5])
matrix = pairwise_distances(a.reshape(-1,1), metric=custom_calc)

matrix如下所示:

array([[0., 1., 2., 3., 4.],
       [1., 0., 1., 2., 3.],
       [2., 1., 0., 1., 2.],
       [3., 2., 1., 0., 1.],
       [4., 3., 2., 1., 0.]])