Python 3.x 数组上的条件作为参数传递给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

我想在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
将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)
,这会是一个解决方案吗?lambda
lambda
有什么特别之处
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)