Python:数组中的条件元素

2024-05-03 12:50:15 发布

您现在位置:Python中文网/ 问答频道 /正文

一个完整的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

输入数组是列数组,因为这与要完成的后处理相匹配。测试可以如下进行:

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

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

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

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

例如,我故意在任何时候都不使用编译过的Python——我想先有一些工作代码。希望也有一些东西,这是很好的Python风格。我希望能够得到N=2**22的执行时间,低于2秒左右。此特定操作将被多次使用,因此执行时间确实很重要。

如果这个问题是愚蠢的,我会事先道歉——我无法在大量不易访问的Python文档或其他线程中找到答案。


Tags: 答案fromimportnumpylenzerosabs数组