有效的方法来计算每个值本身的大于操作

时间:2016-03-31 00:20:28

标签: python numpy pandas scipy

我有一个包含实际值的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]

但它很慢。有没有有效的方法来做到这一点?

1 个答案:

答案 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倍。