2024-03-29 15:29:02 发布
网友
假设我有100000个浮点数组,每个数组有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]
from scipy.stats import threshold thresholded = threshold(array, 0.5)
:)
这是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模块。
在纽比有一个特别的面具班,正是这样做的。可以基于任何前提条件“屏蔽”元素。这比指定零更好地表示您的需要:适当时,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可视化库中可以很好地支持屏蔽数组。
Docs on masked arrays in numpy
:)
这是NumPy的典型作业,对于这些类型的操作来说非常快:
现在,如果只需要highCountX最大的元素,甚至可以“忘记”小元素(而不是将它们设置为0并对它们进行排序),只对大元素列表进行排序:
当然,如果只需要几个元素,那么对整个数组进行排序可能不是最优的。根据您的需要,您可能需要考虑标准的heapq模块。
在纽比有一个特别的面具班,正是这样做的。可以基于任何前提条件“屏蔽”元素。这比指定零更好地表示您的需要:适当时,numpy操作将忽略屏蔽值(例如,查找平均值)。
作为一个附加的好处,如果需要,在matplotlib可视化库中可以很好地支持屏蔽数组。
Docs on masked arrays in numpy
相关问题 更多 >
编程相关推荐