具有 element-eise 条件的矢量化 lambda 函数

Vectorized lambda function with element-eise condition

我想要一个条件 lambda 函数,其中逐个元素地应用条件检查。我有以下代码:

p = np.arange(0,1,0.01)
Kl = lambda p: p + 1 if p>0.5 else p-1
K = Kl(p)

产生错误:

ValueError: The truth value of an array with more than one element is ambiguous.
Use a.any() or a.all()

为什么不能以这种方式使用 lambda 函数?有人可以建议实现这一目标的正确方法吗?谢谢

使用np.where()

In [5]: import numpy as np

In [6]: p = np.arange(0, 1, 0.1)

In [7]: l = lambda x: np.where(x>0.5, x+1, x-1)

In [8]: l(p)
Out[8]: array([-1. , -0.9, -0.8, -0.7, -0.6, -0.5,  1.6,  1.7,  1.8,  1.9])

时间

使用向量化表达式比使用列表表达式更快,尤其是涉及的数组维度很大时。在下文中,对于 100 万个项目,np.where(…)list(map(…)) 快约 70 倍,而对于 100 个项目,优势要小得多...

In [14]: p = np.arange(0, 1, 0.000001)

In [15]: K0 = lambda p: np.where(p>0.5, p+1, p-1)

In [16]: K1 = lambda p: p + 1 if p>0.5 else p-1

In [17]: %timeit _ = K0(p)
100 loops, best of 3: 8.1 ms per loop

In [18]: %timeit _ = list(map(K1, p))
1 loop, best of 3: 557 ms per loop

In [19]: p = np.arange(0, 1, 0.01)

In [20]: %timeit _ = K0(p)
The slowest run took 9.97 times longer than the fastest. This could mean that an intermediate result is being cached.
100000 loops, best of 3: 6.99 µs per loop

In [21]: %timeit _ = list(map(K1, p))
10000 loops, best of 3: 58.5 µs per loop