Это должно сделать это:
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
еще быстрее для небольших массивов, но немного медленнее для больших массивов.