快速将数组中低值置零的方法?
假设我有10万个浮点数组,每个数组有100个元素。我需要找出最高的X个值,但前提是这些值要大于Y。任何不符合这个条件的元素都应该设置为0。请问在Python中,最快的做法是什么?顺序必须保持不变。大部分元素已经是0了。
示例变量:
array = [.06, .25, 0, .15, .5, 0, 0, 0.04, 0, 0]
highCountX = 3
lowValY = .1
期望的结果:
array = [0, .25, 0, .15, .5, 0, 0, 0, 0, 0]
9 个回答
7
NumPy里有一个特别的叫做MaskedArray的类,它可以做到这一点。你可以根据任何条件来“屏蔽”某些元素。这比直接把它们设为零要更符合你的需求:在进行numpy操作时,适当的时候会忽略被屏蔽的值(比如计算平均值时)。
>>> from numpy import ma
>>> x = ma.array([.06, .25, 0, .15, .5, 0, 0, 0.04, 0, 0])
>>> x1 = ma.masked_inside(0, 0.1) # mask everything in 0..0.1 range
>>> x1
masked_array(data = [-- 0.25 -- 0.15 0.5 -- -- -- -- --],
mask = [ True False True False False True True True True True],
fill_value = 1e+20)
>>> print x.filled(0) # Fill with zeroes
[ 0 0.25 0 0.15 0.5 0 0 0 0 0 ]
另外一个好处是,如果你需要可视化,屏蔽数组在matplotlib这个可视化库中也得到了很好的支持。
20
from scipy.stats import threshold
thresholded = threshold(array, 0.5)
:)
79
这通常是用NumPy来做的,因为它在处理这类操作时非常快:
array_np = numpy.asarray(array)
low_values_flags = array_np < lowValY # Where values are low
array_np[low_values_flags] = 0 # All low values set to 0
现在,如果你只需要找出最大的highCountX个元素,你甚至可以“忽略”那些小的元素(不需要把它们设为0再排序),只对大的元素进行排序:
array_np = numpy.asarray(array)
print numpy.sort(array_np[array_np >= lowValY])[-highCountX:]
当然,如果你只需要几个元素,排序整个数组可能不是最好的选择。根据你的需求,你可以考虑使用标准的heapq模块。