我有一个包含实际值的numpy向量。 对于此向量中的每个值,我想计算大于值本身的值的数量。
例如:
input: array([1.,2.,3.,1.,1.,0.,10.]) # numpy array
output: array([3, 2, 1, 3, 3, 6, 0])
我的第一个想法是:
# pandas
df[column].apply(lambda x: (df[column] > x).sum())
# numpy equivalent
[(arr>x).sum() for x in arr]
但它很慢。有没有有效的方法来做到这一点?
答案 0 :(得分:4)
一种简单的方法是使用Python的bisect
模块:
import bisect
array = [1.,2.,3.,1.,1.,0.,10.]
n = len(array)
sorted_array = sorted(array)
print [n - bisect.bisect(sorted_array, val) for val in array]
这将创建数组的排序副本,然后使用二进制搜索到已排序的数组中,以确定每个原始元素的更多值。
与原始代码O(n logn)
相比,该算法具有O(n^2)
时间复杂度。为了进行比较,我在100K元素的输入数组上进行了测试,速度提高了200倍。
P.S。整个事情可以改写为NumPy单行:
output = array.size - np.searchsorted(np.sort(array), array, side='right')
在我的100K元素测试阵列上,它比原始测试阵列快1300倍。