关于python 2.7:在距离矩阵中访问特定的成对距离(scipy / numpy)

Accessing specific pairwise distances in a distance matrix (scipy / numpy)

我正在使用scipy及其cdist函数从向量数组中计算距离矩阵。

1
2
3
4
5
6
7
8
9
10
11
12
import numpy as np
from scipy.spatial import distance


vectorList = [(0, 10), (4, 8), (9.0, 11.0), (14, 14), (16, 19), (25.5, 17.5), (35, 16)]

#Convert to numpy array
arr = np.array(vectorList)

#Computes distances matrix and set self-comparisons to NaN
d = distance.cdist(arr, arr)
np.fill_diagonal(d, None)

假设我要返回所有低于特定阈值(例如,6)的距离

1
2
3
4
5
#Find pairs of vectors whose separation distance is < 6
id1, id2 = np.nonzero(d<6)

#id1 --> array([0, 1, 1, 2, 2, 3, 3, 4])
#id2 --> array([1, 0, 2, 1, 3, 2, 4, 3])

我现在有2个索引数组。

问题:如何将这些向量对之间的距离作为数组/列表返回?

1
2
3
4
5
6
7
8
4.47213595499958  #d[0][1]
4.47213595499958  #d[1][0]
5.830951894845301 #d[1][2]
5.830951894845301 #d[2][1]
5.830951894845301 #d[2][2]
5.830951894845301 #d[3][2]
5.385164807134504 #d[3][4]
5.385164807134504 #d[4][3]

d[id1][id2]返回一个矩阵,而不是一个列表,到目前为止,我发现的唯一方法是再次遍历距离矩阵,这没有任何意义。

1
np.array([d[i1][i2] for i1, i2 in zip(id1, id2)])

使用

1
d[id1, id2]

这是numpy.nonzero示例显示的形式(即a[np.nonzero(a > 3)]),它与您使用的d[id1][id2]不同。

有关numpy索引的更多详细信息,请参见arrays.indexing。