python - 使标量python函数接受列表和数组
问题描述
在 python 中,是否有一种简单有效的方法可以使函数f(x: float)
同时接受列表和 numpy 数组作为参数(在这种情况下,我想f
逐元素应用并以与发送时相同的格式返回结果)?现在,我只需要一维数组。
作为一个例子(我的真实f
更复杂),假设我有:
def f(x):
return math.log(x) if x > 0 else 0.0
然后这个工作,但不是那么优雅 - 也可能不是那么有效,因为递归(我使用它,因为它允许我只有一个函数):
def f(x):
if np.isscalar(x):
return math.log(x) if x > 0 else 0.0
elif isinstance(x, np.ndarray):
return np.array([f(i) for i in x], dtype=float)
else:
return [f(i) for i in x]
有没有更好的办法?
解决方案
如果您需要的不仅仅是代码库中的单个函数定义,那么使用装饰器函数将是一个不错的选择。这确实意味着您必须包装您的代码,但我假设您所说的“只有一个函数”的意思是您确实希望 f(x) 中的函数表达式在所有情况下都相同。
使用您现有的代码,装饰器函数将如下所示:
def elementwise_possible(func):
def wrapper(x):
if np.isscalar(x):
return func(x)
elif isinstance(x, np.ndarray):
return np.array([func(i) for i in x], dtype=float)
else:
return [func(i) for i in x]
return wrapper
你会这样写你的函数:
@elementwise_possible
def f(x):
return math.log(x) if x > 0 else 0.0
结果输出变为
In[2]: A = f(2)
In[3]: A
Out[3]: 0.6931471805599453
In[4]: B = f(np.array([2,3,4]))
In[5]: B
Out[5]: array([0.69314718, 1.09861229, 1.38629436])
In[6]:C = f([5,6,7])
In[7]:C
Out[7]: [1.6094379124341003, 1.791759469228055, 1.9459101490553132]
我认为效率应该是一样的。
推荐阅读
- python - 客户端证书在 curl 中有效,但在 Python 中无效
- python - SQLAlchemy 安装失败,“模块“枚举”没有属性“IntFlag”
- java - Java Swing:如何通过 JLayeredPane 传递鼠标事件
- javascript - 从 MongoDB 检索的 Javascript 对象中删除一个值
- amazon-web-services - AWS 上的 saltstack 最佳实践
- mobile-safari - 在 Safari 中全屏
- reactjs - 两个从属日期选择器,其中开始日期永远不能大于结束日期
- javascript - 如何检测应用程序中按下的键盘组合?
- amazon-web-services - CloudFormation 中更新和导入的区别
- python - Geopandas:保存为csv时如何指定数据类型?