我尝试将不同的函数应用于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]
谢谢。
答案 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. ])