根据值将不同的函数应用于数组

时间:2018-05-09 14:16:42

标签: python arrays numpy if-statement

我尝试将不同的函数应用于numpy数组的第一部分和第二部分。因此,在此示例中,将小于0.5的项乘以2,并将条数0.5和以上相加1。

def myFunc:
    x = numpy.linspace(0,1,11)
    def test():
        for i in x:
            if i < 0.5:
                a = i*2
            else:
                a = i+1.0
        return(a)

print(test())

我要回复:

[0,0.2,0.4,0.6,0.8,1.5,1.6,1.7,1.8,1.9,2]

谢谢。

5 个答案:

答案 0 :(得分:2)

x = np.linspace(0,1,11)
x[x<0.5]*=2
x[x>=0.5]+=1

答案 1 :(得分:1)

你可以简单地使用列表理解:

[i*2 if i < 0.5 else i+1 for i in x]

答案 2 :(得分:0)

这应该这样做:

x[x < 0.5] *= 2
x[x >= 0.5] +=1

如果你想坚持使用numpy,这比列表推导更可取。

以下是使用列表理解和numpy屏蔽的简短比较:

def myFunc_lc(x):
    return np.asarray([i*2 if i < 0.5 else i+1 for i in x])

def myFunc_np(x):
    x[x < 0.5] *= 2
    x[x >= 0.5] +=1
    return x

def myFunc_np2(x):  # using a constant masking array
    ma = x < 0.5
    x[ma] *= 2
    x[~ma] +=1
    return x

x = np.linspace(0, 1, 11)
%timeit myFunc_np(x)  # 6.62 µs ± 160 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit myFunc_np2(x)  # 6.24 µs ± 113 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit myFunc_lc(x)  # 6.75 µs ± 160 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit np.select([x<0.5,x>=0.5],[x*2,x+1])  # 39.9 µs ± 1.78 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

x = np.linspace(0, 1, 10000)
%timeit myFunc_np(x)  # 43.4 µs ± 1.13 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit myFunc_np2(x)  # 43.8 µs ± 1.26 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit myFunc_lc(x)  # 3.7 ms ± 103 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit np.select([x<0.5,x>=0.5],[x*2,x+1])  # 79.2 µs ± 2.54 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

我想很明显为什么numpy掩蔽比列表理解更好。特别是在使用更大的数组时,numpy会更快。 使用小数组,numpy只是稍微快一些。 np.select对于短阵列来说真的很慢,但对于较大的阵列来说却相当不错。对于小型数组,在myFunc_np2中创建掩码的速度更快,但对于较大的数组,则稍慢一些。

答案 3 :(得分:0)

列表理解(@ chrisz的答案)是最好的方法。

我会帮你解决你的代码问题。它几乎是正确的,但您必须访问数组元素而不是本地变量a才能使其正常工作。您可以遍历索引,并使用语法array[index]进行访问,如下所示:

def myFunc(x):
    for i in range(len(x)):
        if x[i] < 0.5:
            x[i] *= 2
        else:
            x[i] += 1.0
    return(x)

    print(test())
x = np.linspace(0,1,11)
myFunc(x)

此外,当您定义一个函数时,您必须说明它需要哪些参数(即您必须编写def myFunc():而不是def myFunc:

希望你明白:)

答案 4 :(得分:0)

如果您需要numpy解决方案,我将使用select

np.select([x<0.5,x>=0.5],[x*2,x+1])
Out[905]: array([0. , 0.2, 0.4, 0.6, 0.8, 1.5, 1.6, 1.7, 1.8, 1.9, 2. ])