Python 基于改变阈值的np数组中最快值过滤方法
我想根据一些阈值过滤数组Python 基于改变阈值的np数组中最快值过滤方法,python,arrays,numpy,Python,Arrays,Numpy,我想根据一些阈值过滤数组arr arr = np.array([2,2,2,2,2,5,5,5,1]) thresholds = np.array([4,1]) 当arr中的值大于阈值时,我想根据thresholds中的值过滤arr 我的想法是为每个阈值创建一个遮罩 预期结果: # [[False False False False False True True True False] # [ True True True True True True True Tru
arr
arr = np.array([2,2,2,2,2,5,5,5,1])
thresholds = np.array([4,1])
当arr
中的值大于阈值时,我想根据thresholds
中的值过滤arr
我的想法是为每个阈值创建一个遮罩
预期结果:
# [[False False False False False True True True False]
# [ True True True True True True True True False]]
在Python中执行此操作的一种方法:
mask = [True if x>condi else False for condi in thresholds for x in arr]
mask = np.reshape(mask,(2,9))
然后通过filteredar=arr[mask[i]
获得过滤后的数组,其中i
是相关阈值的索引
在Python中有更好的方法(性能方面)吗?特别是我处理的是大型阵列(arr的len大约为250000,对于阈值
还没有具体的len,但我期望的是大型阵列)
编辑:
数据上预期的最终输出是
[数组([5,5,5]),数组([2,2,2,2,2,5,5])]
使用
mask = arr[None,:]>thresholds[:,None]
mask
# Output
# array([[False, False, False, False, False, True, True, True, False],
# [ True, True, True, True, True, True, True, True, False]], dtype=bool)
其思想是通过使用None
(与np.newaxis
)添加一个额外的轴来放大维度,然后按元素比较数组
一旦我们有了遮罩,我们就可以使用各种方法过滤数据,其中的选择很大程度上取决于您的问题:
- 你当然可以
为了获得一个带有过滤数据的列表,但通常速度较慢res = [arr[m] for m in mask] # [array([5, 5, 5]), array([2, 2, 2, 2, 2, 5, 5, 5])]
- 如果您有进一步的数值计算,我将创建一个
,其中只考虑过滤后的数据:屏蔽数组
现在,每一行对应于根据相应阈值过滤的数据。 掩码数组允许您继续使用许多函数,如m = np.zeros_like(mask).astype(np.int) m[:] = arr res = np.ma.masked_where(~mask,m)
或mean
std
res.mean(axis=1) # masked_array(data = [5.0 3.125], # mask = [False False], # fill_value = 1e+20) res.mean(axis=1).compressed() # array([ 5. , 3.125])
mask = arr[None,:]>thresholds[:,None]
mask
# Output
# array([[False, False, False, False, False, True, True, True, False],
# [ True, True, True, True, True, True, True, True, False]], dtype=bool)
其思想是通过使用None
(与np.newaxis
)添加一个额外的轴来放大维度,然后按元素比较数组
一旦我们有了遮罩,我们就可以使用各种方法过滤数据,其中的选择很大程度上取决于您的问题:
- 你当然可以
为了获得一个带有过滤数据的列表,但通常速度较慢res = [arr[m] for m in mask] # [array([5, 5, 5]), array([2, 2, 2, 2, 2, 5, 5, 5])]
- 如果您有进一步的数值计算,我将创建一个
,其中只考虑过滤后的数据:屏蔽数组
现在,每一行对应于根据相应阈值过滤的数据。 掩码数组允许您继续使用许多函数,如m = np.zeros_like(mask).astype(np.int) m[:] = arr res = np.ma.masked_where(~mask,m)
或mean
std
res.mean(axis=1) # masked_array(data = [5.0 3.125], # mask = [False False], # fill_value = 1e+20) res.mean(axis=1).compressed() # array([ 5. , 3.125])
numpy
速度非常快,但几乎从不改变数组的长度,因此几乎没有一个纯粹的numpytonic
解决方案可以解决您的问题。另一方面,列表理解可以很容易地做你想做的事情,但总体来说速度很慢。如果我们知道您想要对结果做什么,我们可以尝试绕过可变长度问题并解决该问题。我在一个numpy数组上有多个select查询,其中where子句中的阈值对于每个查询都会更改。我试图通过以最优化的方式保存查询结果来避免循环和查询。我想直接循环得到的结果。@belas:假设您有预期的输出。。。那你怎么办?给我们看看那个代码。。否则我们帮不了你,它的运行速度肯定比我的代码快。然而,面具仍然需要一些时间。你还有什么进一步的优化建议吗?@belas:为了进一步优化,我们需要更多关于你想对结果做什么的信息。问题如下numpy
速度非常快,但几乎从不改变数组的长度,因此几乎没有一个纯粹的numpytonic
解决方案可以解决您的问题。另一方面,列表理解可以很容易地做你想做的事情,但总体来说速度很慢。如果我们知道您想要对结果做什么,我们可以尝试绕过可变长度问题并解决该问题。我在一个numpy数组上有多个select查询,其中where子句中的阈值对于每个查询都会更改。我试图通过以最优化的方式保存查询结果来避免循环和查询。我想直接循环得到的结果。@belas:假设您有预期的输出。。。那你怎么办?给我们看看那个代码。。否则我们帮不了你