返回包含向量的距离矩阵

时间:2018-07-09 11:01:31

标签: python

我正在尝试计算距离矩阵,但是要根据向量计算,因此我想返回一个距离矩阵,其中(i, j)是两个向量之间的距离,例如在ab之间。因此,在这种情况下,我希望创建一个4x4矩阵,该矩阵在每个位置都包含一个向量。这是我的示例数组,每个数组都包含一个带有多个点的向量。

a = [a1, a2, a3]

b = [b1, b2, b3]

c = [c1, c2, c3]

我尝试使用scipy.spatial.distance.pdistsquareform(这只是给我一个完整的矩阵,而不是压缩矩阵),但是它返回的是单个值而不是向量。

所以像这样的矩阵,

[ 0 1 2        

  1 0 2 

  2 3 0 ]

取而代之的是,每个i, j位置是两个向量之间的距离,因此按照示例包含5个点。

[ [a1/a1, a2/a2, a3/a3 ] [a1/b1, a2/b2, a3/b3] [a1/c1, a2/c2, a3/c3] 

[b1/a1, b2/a2, b3/a3] [b1/b1, b2/b2, b3/b3] [b1/c1, b2/c2, b3/c3] 

[c1/a1, c2/a2, c3/a3] [c1/b1, c2/b2, c3/b3] [c1/c1, c2/c2, c3/c3]]

我想分别计算数组中每个值的距离,所以我不希望计算a1,a2,a3对b1,b2,b3的Eucladian距离,而只是对a1对b1进行计算,依此类推。我想返回一个向量,该向量包括在数组a和b的所有值之间计算出的距离,并将其定位在(a,b)处。通过“ /”,我想显示应该计算出两个值之间的距离。

1 个答案:

答案 0 :(得分:0)

据我了解,您要的是每个元素的距离(绝对值?),这样两个列表之间的“距离”也是一个列表。 这是我的小例子

vec = [[1, 2, 3], #a
       [4, 5, 6], #b
       [7, 8, 9]] #c
#oneliner
mat = [[[abs(vec[i][k] - vec[j][k] for k in len(vec[i]))]
                                   for j in len(vec)]
                                   for i in len(vec)]

输出:

mat
[[[0, 0, 0], [3, 3, 3], [6, 6, 6]], 
 [[3, 3, 3], [0, 0, 0], [3, 3, 3]], 
 [[6, 6, 6], [3, 3, 3], [0, 0, 0]]]

并且由于结果是对称的,因此我们只能计算矩阵的前半部分:

mat = [[[abs(vec[i][k] - vec[j][k]) for k in range(len(vec[i]))] 
                                    if i<j else [] 
                                    for j in range(len(vec))]
                                    for i in range(len(vec))]

将输出如下内容:

mat
[[[], [3, 3, 3], [6, 6, 6]], 
 [[], [],        [3, 3, 3]], 
 [[], [],        []]]
相关问题