Python:数组中的条件元素

Lar*_*rs1 2 python arrays conditional

一个完整的Python新手的问题.

我有一个列数组,我需要强制某些值为零,具体取决于应用于另一个数组的条件语句.我找到了两个解决方案,它们都提供了正确答案.但是对于我通常需要的较大阵列(> 1E6元素)而言,它们都非常耗时 - 我还怀疑它编程技术很差.这两个版本是:

from numpy import zeros,abs,multiply,array,reshape

def testA(y, f, FC1, FC2):
    c = zeros((len(f),1))
    for n in xrange(len(f)):
        if abs(f[n,0]) >= FC1 and abs(f[n,0]) <= FC2:
            c[n,0] = 1.
    w = multiply(c,y)
    return w

def testB(y, f, FC1, FC2):
    z = [(abs(f[n,0])>=FC1 and abs(f[n,0])<=FC2) for n in xrange(len(f))]
    z = multiply(array(z,dtype=float).reshape(len(f),1), y)
    return z
Run Code Online (Sandbox Code Playgroud)

输入数组是列数组,因为这与要完成的后处理相匹配.测试可以这样完成:

>>> from numpy.random import normal as randn
>>> fs, N = 1.E3, 2**22
>>> f = fs/N*arange(N).reshape((N,1))
>>> x = randn(size=(N,1))
>>> w1 = testA(x,f,200.,550.)
>>> z1 = testB(x,f,200.,550.)
Run Code Online (Sandbox Code Playgroud)

在我的笔记本电脑上,testA需要18.7秒,testB需要19.3 - 两者都是N = 2**22.在testB中,我还尝试将"z = [None]*len(f)"包含在另一个线程中建议的预分配中,但这并没有什么区别.

我有两个问题,我希望得到相同的答案:

  1. 什么是这个问题的"正确"Python解决方案?
  2. 我能做些什么来更快地得到答案吗?

我故意不使用任何时间使用编译的Python - 我想先得到一些工作代码.希望还有一些东西,这是很好的Python风格.我希望能够在2秒左右的时间内获得N = 2**22的执行时间.此特定操作将被多次使用,因此执行时间很重要.

如果问题是愚蠢的,我会提前道歉 - 我无法在绝大多数不容易访问的Python文档或其他线程中找到答案.

HYR*_*YRY 5

使用bool数组访问数组y中的元素:

def testC(y, f, FC1, FC2):
    f2 = abs(f)
    idx = (f2>=FC1) & (f2<=FC2)
    y[~idx] = 0
    return y
Run Code Online (Sandbox Code Playgroud)