numpy如果我想比较两个数组,比如说我想测试A中的所有元素是否小于B中的值,我使用if (A < B).all():.但实际上,这需要分配和评估完整的数组C = A < B然后调用C.all()它.这有点浪费.有没有办法'快捷'比较,即直接A < B逐元素地评估(没有分配和临时计算C),并False在找到第一个无效元素比较时停止并返回?
普通 Pythonand并or使用快捷方式求值,但numpy没有。
(A < B).all()
Run Code Online (Sandbox Code Playgroud)
使用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)
Run Code Online (Sandbox Code Playgroud)
示例运行:
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
Run Code Online (Sandbox Code Playgroud)
从默认值开始False,然后选择不同的break条件,您就会获得快捷方式any。将测试推广到处理<、<=等将需要更多工作。
在 Python 中得到类似的东西,然后在 Cython 中尝试。如果您在该步骤中遇到问题,请返回一个新问题。SO 拥有良好的 Cython 用户基础。
| 归档时间: |
|
| 查看次数: |
362 次 |
| 最近记录: |