【发布时间】:2020-08-01 21:48:00
【问题描述】:
我有一个函数,给定一个 xy 坐标的 numpy 数组,它会过滤位于边 L 的盒子内的那些
import numpy as np
from numba import njit
np.random.seed(65238758)
L = 10
N = 1000
xy = np.random.uniform(0, 50, (N, 2))
box = np.array([
[0,0], # lower-left
[L,L] # upper-right
])
def sinjit(xy, box):
mask = np.all(np.logical_and(xy >= box[0], xy <= box[1]), axis=1)
return xy[mask]
如果我运行这个函数,它会返回正确的结果:
sinjit(xy, box)
Output: array([[5.53200522, 7.86890708],
[4.60188554, 9.15249881],
[9.072563 , 5.6874726 ],
[4.48976127, 8.73258166],
...
[6.29683131, 5.34225758],
[2.68057087, 5.09835442],
[5.98608603, 4.87845464],
[2.42049857, 6.34739079],
[4.28586677, 5.79125413]])
但是,由于我想通过使用 numba 在循环中加速此任务,因此 np.all 函数中的“axis”参数存在兼容性问题(它未在 nopython 模式下实现)。所以,我的问题是,是否有可能以任何方式避免这种争论?有什么解决办法吗?
【问题讨论】:
-
但是如果你的代码已经被矢量化了,你为什么还要在这里使用 numba?
-
因为这只是一次迭代,我想把它放在一个 for 循环中,以构建许多具有不同域范围的单元格。并且循环在纯 Python 中效率很低
-
我明白了,您将遍历许多
xy数组? -
我想遍历很多盒子。主要思想是我有一个边缘 L 的主要 2D 盒子,里面有很多粒子,所以我想将域划分为更小的单元
-
除此之外,所有的代码都进入一个带有“jitclass”的编译类,那么“numba”的使用是强制性的