gpt4 book ai didi

python - numpy 数组比较的快捷评估

转载 作者:太空狗 更新时间:2023-10-29 20:31:19 25 4
gpt4 key购买 nike

在 numpy 中,如果我想比较两个数组,例如我想测试 A 中的所有元素是否都小于 B 中的值,我使用 if (A < B).all(): .但实际上这需要分配和评估完整数组 C = A < B然后调用C.all()在上面。这有点浪费。有什么方法可以“快捷”比较,即直接评估 A < B逐个元素(不分配和计算临时 C )并停止并返回 False何时发现第一个无效元素比较?

最佳答案

纯 Python andor使用快捷方式求值,但是 numpy没有。

(A < B).all()

使用numpy积木、广播、逐元素比较 <all减少。 <仅适用于其他二元运算,plus、times、and、or、gt、le 等。And all与其他还原方法一样,any , max , sum , mean , 并且可以对整个数组或按行或按列进行操作。

可以编写一个结合 all 的函数和 <进入一次迭代,但很难获得我刚才描述的普遍性。

但是,如果您必须实现迭代解决方案,使用快捷方式并快速完成,我建议使用 nditer 来开发这个想法。 , 然后用 cython 编译它.

http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html是使用 nditer 的好教程,它会带您在 cython 中使用它. nditer负责广播和迭代,让您专注于比较和任何快捷方式。

这是一个可以转换为 cython 的迭代器的草图:

import numpy as np

a = np.arange(4)[:,None]
b = np.arange(2,5)[None,:]
c = np.array(True)
it = np.nditer([a, b, c], flags=['reduce_ok'],
op_flags = [['readonly'], ['readonly'],['readwrite']])
for x, y, z in it:
z[...] = x<y
if not z:
print('>',x,y)
break
else:
print(x,y)
print(z)

运行示例:

1420:~/mypy$ python stack34852272.py 
(array(0), array(2))
(array(0), array(3))
(array(0), array(4))
(array(1), array(2))
(array(1), array(3))
(array(1), array(4))
('>', array(2), array(2))
False

从默认 False 开始, 和一个不同的 break条件,你会得到一个快捷方式 any .概括测试以处理 < , <=等将会有更多的工作。

在 Python 中使用类似的东西,然后在 Cython 中尝试它。如果您在执行该步骤时遇到问题,请回来提出一个新问题。 SO 拥有良好的 Cython 用户群。

关于python - numpy 数组比较的快捷评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34852272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com