具有 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
我想要一个条件 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