python - numpy:对操作结果执行“任何”或“全部”的有效方法
问题描述
假设您有两个 NumPy 数组a
和b
,并且您想要测试 的任何值a
是否大于 的对应值b
。
现在你可以计算一个布尔数组并调用它的any
方法:
(a > b).any()
这将在内部完成所有循环,这很好,但它需要对所有对执行比较,即使第一个结果评估为True
。
或者,您可以对标量比较进行显式循环。a
在和b
形状相同的情况下(因此不需要广播)的示例实现可能如下所示:
any(ai > bi for ai, bi in zip(a.flatten(), b.flatten()))
这将受益于True
遇到第一个结果后停止处理的能力,但所有成本都与 Python 中的显式循环相关(尽管在理解内)。
有没有办法,无论是在 NumPy 本身还是在外部库中,您都可以传递您希望执行的操作的描述,而不是该操作的结果,然后让它在内部执行操作(优化低级代码)在一个“任何”循环中,可以从中中断?
可以假设某种接口,例如:
from array_operations import GreaterThan, Any
expression1 = GreaterThan('x', 'y')
expression2 = Any(expression1)
print(expression2.evaluate(x=a, y=b))
如果存在这样的东西,就能够动态地创建函数而言,它显然可以具有除了对all
和的有效评估之外的其他用途。any
有这样的吗?
解决方案
解决此问题的一种方法是延迟/延迟/延迟评估。C++ 社区使用一种叫做“表达式模板”的东西来实现这一点;您可以在此处找到可访问的概述:http: //courses.csail.mit.edu/18.337/2015/projects/TylerOlsen/18337_tjolsen_ExpressionTemplates.pdf
在 Python 中,最简单的方法是使用 Numba。你基本上只是使用循环在 Python 中编写你需要的函数for
,然后你用它来装饰它就@numba.njit
完成了。像这样:
@numba.njit
def any_greater(a, b):
for ai, bi in zip(a.flatten(), b.flatten()):
if ai > bi:
return True
return False
有/曾经有一个 NumPy 增强提案可以帮助您的用例,但我认为它尚未实施:https ://docs.scipy.org/doc/numpy-1.13.0/neps/deferred-ufunc-评估.html
推荐阅读
- macos - 用外部符号替换 MacOS Mach-O 二进制文件中的静态符号
- java - Spring Boot 和 Hibernate:用于 org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor
- java - 这个双重检查锁的java功能版本安全吗?
- python - Python:如何从 for 循环中的列表中仅减去相应的值
- ffmpeg - FFMPEG 图像到视频的反向序列与其他过滤器
- scala - 由于阶段故障而中止作业:ShuffleMapStage 20(在 data_prep.scala:87 处重新分区)失败了最大允许次数:4
- python - 使用 concurrent.futures.ThreadPoolExecutor() 作为执行者:...不等待
- node.js - 需要使用 Electron JS 与现金抽屉等硬件设备交互
- excel - Excel VBA:用范围交换列
- opengl-es - 使用双 FBO 在 vs 多 FBO 之间切换