Accessing specific pairwise distances in a distance matrix (scipy / numpy)
我正在使用
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) |
假设我要返回所有低于特定阈值(例如,
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] |
1 | np.array([d[i1][i2] for i1, i2 in zip(id1, id2)]) |
使用
1 | d[id1, id2] |
这是numpy.nonzero示例显示的形式(即
有关numpy索引的更多详细信息,请参见arrays.indexing。