普通的Python中,and
和or
会使用快捷求值,但是numpy
不会。
(A < B).all()
使用
numpy
构建块,广播,逐元素比较与
<
和
all
约简。
<
像其他二进制运算一样工作,加,乘,和,或,gt,le等。
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用户。
allclose()
的函数,我相信它会在找到第一个不符合要求的元素时停止。所以我很惊讶我没有找到allequal(a,b)
、allless(a,b)
和allgreater(a,b)
,我相信它们都会在使用中非常受欢迎,因为if (A<B).all():
和类似的模式相当普遍。 - HiFile.app - best file managernumpy
源代码,发现我们有一个allequal(a,b)
函数(部分更正我的先前评论),但它不会快速评估,这很遗憾。 - HiFile.app - best file manager