python - numpy:对操作结果执行 "any"或 "all"的有效方法

标签 python arrays numpy

假设您有两个 NumPy 数组,ab ,并且您想测试 a 是否有任何值大于b的对应值.
现在你可以计算一个 bool 数组并调用它的 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。您基本上只需使用 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

关于python - numpy:对操作结果执行 "any"或 "all"的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62608574/

相关文章:

python - Numpy:有没有办法使用 np.argmax 搜索连续值?

Python XML 从 CDATA 之间的文件中获取 IP

python - 让 distutils 在正确的位置查找 numpy 头文件

python - 在 python 中使用选择排序对数组进行排序。我该如何优化?

C - 将结构解构为 char 数组

c++ - 如何动态创建一个指针数组?

python - matplotlib选择图像的框区域然后放大

java - 在Java中将数字存储到字符串数组中的问题

python - 标准化后的 PIL 逊相关性

Hadoop 流式传输创建 numpy 数组的最快方法