如何解决笨拙-以矢量形式编写函数吗?
我是NumPy(或SciPy)的新手,来自Octave / Matlab,这对我来说似乎有点挑战。
我正在阅读文档并编写一些基本功能。我遇到了以下部分:Vectorizing functions (vectorize)
它定义了此功能:
def addsubtract(a,b):
if a > b:
return a - b
else:
return a + b
然后将其矢量化:
vec_addsubtract = np.vectorize(addsubtract)
但是最后,它说:
可以不用向量化就可以以向量形式编写此特定功能。
我不知道其他任何方式来编写这种功能。那么向量形式是什么?
解决方法
np.vectorize
是一个美化的python for
循环,这意味着它有效地剥离了numpy提供的所有优化。
要实际向量化addsubtract
,我们可以使用numpy提供以下三个事实:向量化add
函数,向量化subtract
函数以及各种布尔掩码操作。 / p>
最简单但效率最低的方法是使用np.where
:
np.where(a > b,a - b,a + b)
这是低效率的,因为在 all 情况下它会预先计算a - b
和a + b
,然后为每个元素从一个或另一个中进行选择。
更有效的解决方案将仅在条件要求的情况下计算值:
result = np.empty_like(a)
mask = a > b
np.subtract(a,b,where=mask,out=result)
np.add(a,where=~mask,out=result)
对于非常小的数组,复杂方法的开销使其不那么值得。但是对于大型阵列,这是最快的解决方案。
有趣的事实:您要引用的教程中的页面将在以后的SciPy教程版本中完全不可用,因为它是NumPy的简介,如PR #12432中所述。
,您可以使用np.where
进行此操作,它可以计算两个结果(a-b
和a+b
)并根据布尔数组(a>b
)选择值:>
def addsubtract(a,b):
return np.where(a>b,a-b,a+b)
它可以看作是向量化三元运算符:“其中a> b,从a-b取值,否则从a + b取值”。
尽管计算了两种可能的结果,但它都比您编写的矢量化if / else函数(至少在我的机器上)快得多。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。