如何解决Numpy:在两个集合之间的二维数组中找到第 k 个最大或最小的 演示
假设我在 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,38.06217772,41.69615233],[228.21915948,11.32050776],[234.46787035,166.7409761,41.69615233,11.32050776,0. ]])
如果我们知道有三个集合,例如 {0}、{1,2}、{3,4},我们如何找到集合之间的第 k 个最大值或第 k 个最小值。
例如,集合 {0} 和 {1,2} 之间的最大值是 260.42493099。
解决方法
这是一个基于 NumPy 的 it doesn't look like there's an option for creating multiple databases 和 ix_
的完全矢量化的解决方案:
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,38.06217772,41.69615233],[228.21915948,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,2]) # smallest
Out[1154]: 67.72689426
In [1155]: kth_extreme(f,[3,4],k=2) # second smallest
Out[1155]: 41.69615233
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。