将scipy压缩距离矩阵转换为按行读取的较低矩阵

时间:2017-06-05 23:41:22

标签: python numpy scipy

我有一个scipy的压缩距离矩阵,我需要传递给C函数,该函数要求矩阵转换为行读取的下三角形。例如:

0 1 2 3 
  0 4 5 
    0 6
      0 

此缩写形式为:[1,2,3,4,5,6]但我需要将其转换为

0
1 0
2 4 0
3 5 6 0

按行读取的下三角形为:[1,2,4,3,5,6]

我希望在不创建冗余矩阵的情况下将紧凑距离矩阵转换为此形式。

1 个答案:

答案 0 :(得分:3)

这是一个快速实现 - 但它创建了方形冗余距离矩阵作为中间步骤:

In [128]: import numpy as np

In [129]: from scipy.spatial.distance import squareform

c是距离矩阵的浓缩形式:

In [130]: c = np.array([1, 2, 3, 4, 5, 6])

d是冗余的方距矩阵:

In [131]: d = squareform(c)

这是你缩小的下三角距离:

In [132]: d[np.tril_indices(d.shape[0], -1)]
Out[132]: array([1, 2, 4, 3, 5, 6])

这是一种避免形成冗余距离矩阵的方法。函数condensed_index(i, j, n)采用冗余距离矩阵的行i和列jj> i,并返回压缩距离数组中的相应索引。

In [169]: def condensed_index(i, j, n):
     ...:     return n*i - i*(i+1)//2 + j - i - 1
     ...: 

如上所述,c是压缩距离数组。

In [170]: c
Out[170]: array([1, 2, 3, 4, 5, 6])

In [171]: n = 4

In [172]: i, j = np.tril_indices(n, -1)

请注意,以下调用中的参数相反:

In [173]: indices = condensed_index(j, i, n)

indices给出了浓缩距离数组的所需排列。

In [174]: c[indices]
Out[174]: array([1, 2, 4, 3, 5, 6])

(在this question的几个答案中,基本上与condensed_index(i, j, n)的功能相同。)