numpy:对操作结果执行“任何”或“所有”操作的有效方法

2024-09-29 21:26:39 发布

您现在位置:Python中文网/ 问答频道 /正文

假设您有两个NumPy数组ab,您想测试a的任何值是否大于b的相应值

现在,您可以计算布尔数组并调用其any方法:

(a > b).any()

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

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

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))

如果存在这样的东西,显然它除了能够动态地创建函数外,还可以有其他用途,比如对allany进行有效的评估

有这样的吗


Tags: 方法numpytrueany数组ai形状标量
1条回答
网友
1楼 · 发布于 2024-09-29 21:26:39

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

在Python中,最简单的方法是使用Numba。基本上,您只需使用for循环在Python中编写所需的函数,然后使用@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-evaluation.html

相关问题 更多 >

    热门问题