首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >numpy:对操作结果执行“任意”或“全部”的有效方法

numpy:对操作结果执行“任意”或“全部”的有效方法
EN

Stack Overflow用户
提问于 2020-06-27 10:05:34
回答 1查看 95关注 0票数 5

假设您有两个NumPy数组,ab,并且要测试a的值是否大于b的对应值。

现在您可以计算一个布尔数组并调用它的any方法:

代码语言:javascript
复制
(a > b).any()

这将在内部执行所有循环,这是很好的,但是它需要对所有对执行比较,即使第一个结果计算为True

或者,您可以对标量比较执行显式循环。在ab形状相同(因此不需要广播)的情况下,示例实现可能如下所示:

代码语言:javascript
复制
any(ai > bi for ai, bi in zip(a.flatten(), b.flatten()))

这将受益于在遇到第一个True结果之后停止处理的能力,但是使用Python中的显式循环(尽管在理解过程中)所需的所有成本。

在NumPy本身或外部库中,是否有任何方法可以传递希望执行的操作的描述,而不是该操作的结果,然后让它在内部(以优化的低级别代码)执行可以从其中分离出来的“任意”循环?

人们可以想象某种假设性的界面,比如:

代码语言:javascript
复制
from array_operations import GreaterThan, Any

expression1 = GreaterThan('x', 'y')
expression2 = Any(expression1)

print(expression2.evaluate(x=a, y=b))

如果存在这样的事情,显然,它在动态创建函数方面,除了对allany的有效评估之外,还可以有其他用途。

有这样的东西吗?

EN

回答 1

Stack Overflow用户

发布于 2020-06-27 10:17:49

解决这一问题的一种方法是延迟/延迟/延迟评估。C++社区使用所谓的“表达式模板”来实现这一点;您可以在这里找到一个可访问的概述:http://courses.csail.mit.edu/18.337/2015/projects/TylerOlsen/18337_tjolsen_ExpressionTemplates.pdf

在Python中,最简单的方法是使用Numba。基本上,您只需使用for循环在Python中编写所需的函数,然后用@numba.njit修饰它,它就完成了。如下所示:

代码语言:javascript
复制
@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-evaluation.html

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62608574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档