scipy 在不计算整个数组的秩的情况下,确定现有numpy数组中新元素的秩的最快方法是什么?

wwwo4jvm  于 2023-03-08  发布在  其他
关注(0)|答案(2)|浏览(106)

给定一个数组A和一个十进制数X,我想知道XA中的秩,直接的方法是在初始数组中添加一个新的数字,在其上运行rankdata,并选择最后一个元素,如下所示:

import numpy as np
from scipy.stats import rankdata

A = np.array([33.25, 40.16, 18.22, 96.34, 71.15, 48.12, 52.41, 83.11, 12.22])
X = 54.17
B = np.append(A, X)
ranks = rankdata(-B) # reverse an array so that the largest value will have rank 1
rank = int(ranks[-1])

即使它产生了正确的结果,为了经常在大型数组上运行它,在不对整个数组排序的情况下获得它也会很有用。
考虑到这一点,我想知道是否有一个numpyscipy的习惯用法做得更快。

mutmk8jj

mutmk8jj1#

在将值追加到新数组之前(甚至不追加),可以使用与X比较的np.sum。
使用与您要查找的排名顺序相对应的比较:

rank = np.sum(A<X)+1  # 7  (i.e. X is 7th smallest)

rank = np.sum(A>X)+1   # 4 (i.e. X is 4th largest)
gg58donl

gg58donl2#

由于你想“经常且在大数组中”确定新项的排序,你需要一个排序列表。因此,你最好把新项保存在一个排序数据结构中。一些复杂度最高的数据结构(O(n log(n)))是B树和堆。

相关问题