假设我得到了5个地方(例如[0,1,2,3,4]之类的地方)之间的距离矩阵,它是5 \ times 5 2D数组
f = np.array([[ 0. , 67.72689426, 260.42493099, 228.21915948,
234.46787035],
[ 67.72689426, 0. , 204.04482377, 165.98264605,
166.7409761 ],
[260.42493099, 204.04482377, 0. , 38.06217772,
41.69615233],
[228.21915948, 165.98264605, 38.06217772, 0. ,
11.32050776],
[234.46787035, 166.7409761 , 41.69615233, 11.32050776,
0. ]])
如果我们知道有三个集合,例如{0},{1,2},{3,4},那么我们如何找到集合之间的第k个最大值或第k个最小值。
例如,集合{0}和{1,2}之间的最大值为260.42493099。
这是一个基于NumPyix_
和的完全矢量化的解决方案unique
:
def kth_extreme(arr, ind1, ind2, k=1, ascending=True):
values = np.unique(arr[np.ix_(ind1, ind2)])
return values[k-1] if ascending else values[-k]
笔记:
k=1
在函数调用中使用(默认值)。对于第二大(或最小)的对象,您必须传递k=2
,依此类推。arr
。上面的解决方案将重复值视为单个值。如果您希望考虑多个值,则应更改np.unique(arr[np.ix_(ind1, ind2)])
为np.sort(np.ravel(arr[np.ix_(ind1, ind2)]))
。In [1152]: f
Out[1152]:
array([[ 0. , 67.72689426, 260.42493099, 228.21915948, 234.46787035],
[ 67.72689426, 0. , 204.04482377, 165.98264605, 166.7409761 ],
[260.42493099, 204.04482377, 0. , 38.06217772, 41.69615233],
[228.21915948, 165.98264605, 38.06217772, 0. , 11.32050776],
[234.46787035, 166.7409761 , 41.69615233, 11.32050776, 0. ]])
In [1153]: kth_extreme(f, [0], [1, 2], ascending=False) # largest
Out[1153]: 260.42493099
In [1154]: kth_extreme(f, [0], [1, 2]) # smallest
Out[1154]: 67.72689426
In [1155]: kth_extreme(f, [1, 2], [3, 4], k=2) # second smallest
Out[1155]: 41.69615233
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句