Python 3.x 数组上的条件作为参数传递给lambda函数
我想在lambda函数中加入一个条件Python 3.x 数组上的条件作为参数传递给lambda函数,python-3.x,numpy,lambda,Python 3.x,Numpy,Lambda,我想在lambda函数中加入一个条件 import numpy as np import matplotlib.pyplot as plt def my_func(): return lambda x: np.sin(x) if x < np.pi else np.cos(x) x = np.linspace(0, 2*np.pi, 1000) y = my_func() plt.plot(x, y(x)) plt.show() 将numpy导入为np 将ma
import numpy as np
import matplotlib.pyplot as plt
def my_func():
return lambda x: np.sin(x) if x < np.pi else np.cos(x)
x = np.linspace(0, 2*np.pi, 1000)
y = my_func()
plt.plot(x, y(x))
plt.show()
将numpy导入为np
将matplotlib.pyplot作为plt导入
def my_func():
如果x
当我将数组“x”传递给lambda函数时,它显然给出了一个不明确/多个真值的数组,并建议使用any()或all()。但这不符合我的目的
我如何才能达到预期的结果?谢谢。这个功能怎么样:
In [257]: def myfunc():
...: def foo(x):
...: res = [np.sin(i) if i<np.pi else np.cos(i) for i in x]
...: return np.array(res)
...: return foo
...:
In [258]: y=myfunc()
In [260]: y(np.linspace(0, 2*np.pi,5))
Out[260]:
array([ 0.0000000e+00, 1.0000000e+00, -1.0000000e+00, -1.8369702e-16,
1.0000000e+00])
恩佐
恩佐建议沿_轴应用
。虽然我反对它对速度没有帮助,但更重要的是,它在这里没有帮助
In [261]: def my_func():
...: return lambda x: np.sin(x) if x < np.pi else np.cos(x)
...:
In [262]: y=my_func()
In [263]: y(0)
Out[263]: 0.0
添加尺寸标注后,apply…
起作用。但通常当人们在应用方面遇到问题时,他们的目标是提高速度(“矢量化”)。他们认为,或者至少希望,它将比简单的迭代更快。它可能不会被弃用,但它肯定会使用一些免责声明
In [292]: y=my_func()
In [293]: timeit np.array([y(i) for i in np.linspace(0, 2*np.pi, 5)])
88.7 µs ± 966 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [294]: timeit np.apply_along_axis(y, 0, [np.linspace(0, 2*np.pi, 5)])
181 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)
看一看。在这个例子中,这确实提供了期望的结果,但我需要一个lambda函数作为我的主程序的回报,而numpy.pieclewise给出了计算的数组。如果用替换
y(x)
,这会是一个解决方案吗?lambdalambda
有什么特别之处lambda
只是定义函数的一行方法。您正在绘制一个数组,它是y(x)
的结果,而不是y
。这是如果x@Enzo,apply_沿_轴
将1d数组传递给函数,并在其他维度上迭代。它不是一个速度工具。不要推荐。如果您没有按照OP要求使用lambda
,您的解决方案比我的更好吗?要修复我的解决方案,只需执行np.沿_轴应用_(y,0,[np.linspace(0,2*np.pi,5)]
和OP的fine.numpy.where帮助我保留lambda函数并应用条件。我知道lambda本身是不需要的,因此具有定义为foo的子函数的解决方案也适用于该问题。我很惊讶我以前使用过这两种方法,但是对于这个特殊的问题,我没有想到这一点。谢谢
In [265]: np.apply_along_axes(y, 0, np.linspace(0,2*np.pi,5))
Traceback (most recent call last):
File "<ipython-input-265-24f826b71908>", line 1, in <module>
np.apply_along_axes(y, 0, np.linspace(0,2*np.pi,5))
File "/usr/local/lib/python3.8/dist-packages/numpy/__init__.py", line 303, in __getattr__
raise AttributeError("module {!r} has no attribute "
AttributeError: module 'numpy' has no attribute 'apply_along_axes'
In [266]: np.apply_along_axis(y, 0, np.linspace(0,2*np.pi,5))
Traceback (most recent call last):
File "<ipython-input-266-fca42b21012f>", line 1, in <module>
np.apply_along_axis(y, 0, np.linspace(0,2*np.pi,5))
File "<__array_function__ internals>", line 5, in apply_along_axis
File "/usr/local/lib/python3.8/dist-packages/numpy/lib/shape_base.py", line 379, in apply_along_axis
res = asanyarray(func1d(inarr_view[ind0], *args, **kwargs))
File "<ipython-input-261-ac6ffeefd41a>", line 2, in <lambda>
return lambda x: np.sin(x) if x < np.pi else np.cos(x)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [267]: np.apply_along_axis(lambda x:str(x), 0, np.linspace(0,2*np.pi,5))
Out[267]:
array('[0. 1.57079633 3.14159265 4.71238898 6.28318531]',
dtype='<U56')
In [292]: y=my_func()
In [293]: timeit np.array([y(i) for i in np.linspace(0, 2*np.pi, 5)])
88.7 µs ± 966 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
In [294]: timeit np.apply_along_axis(y, 0, [np.linspace(0, 2*np.pi, 5)])
181 µs ± 134 ns per loop (mean ± std. dev. of 7 runs, 1000 loops each)