Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 基于改变阈值的np数组中最快值过滤方法_Python_Arrays_Numpy - Fatal编程技术网

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])
    

最终输出是什么?@Divakar我的最终输出是获得过滤后的数组。你能写下给定数据的最终输出吗?@Divakar编辑问题以显示预期输出最终输出是什么?@Divakar我的最终输出是获得过滤后的数组。你能写下给定数据的最终输出吗?@Divakar编辑问题以显示预期输出它运行速度肯定比我的代码快。然而,面具仍然需要一些时间。你还有什么进一步的优化建议吗?@belas:为了进一步优化,我们需要更多关于你想对结果做什么的信息。问题如下
numpy
速度非常快,但几乎从不改变数组的长度,因此几乎没有一个纯粹的
numpytonic
解决方案可以解决您的问题。另一方面,列表理解可以很容易地做你想做的事情,但总体来说速度很慢。如果我们知道您想要对结果做什么,我们可以尝试绕过可变长度问题并解决该问题。我在一个numpy数组上有多个select查询,其中where子句中的阈值对于每个查询都会更改。我试图通过以最优化的方式保存查询结果来避免循环和查询。我想直接循环得到的结果。@belas:假设您有预期的输出。。。那你怎么办?给我们看看那个代码。。否则我们帮不了你,它的运行速度肯定比我的代码快。然而,面具仍然需要一些时间。你还有什么进一步的优化建议吗?@belas:为了进一步优化,我们需要更多关于你想对结果做什么的信息。问题如下
numpy
速度非常快,但几乎从不改变数组的长度,因此几乎没有一个纯粹的
numpytonic
解决方案可以解决您的问题。另一方面,列表理解可以很容易地做你想做的事情,但总体来说速度很慢。如果我们知道您想要对结果做什么,我们可以尝试绕过可变长度问题并解决该问题。我在一个numpy数组上有多个select查询,其中where子句中的阈值对于每个查询都会更改。我试图通过以最优化的方式保存查询结果来避免循环和查询。我想直接循环得到的结果。@belas:假设您有预期的输出。。。那你怎么办?给我们看看那个代码。。否则我们帮不了你