我正在尝试将for循环与numba并行。我是这个库的新手,但经过一些研究后,我编写了这段代码,与我研究的示例相比,这段代码看起来是正确的:
@njit(nopython=True, parallel=True)
def tempFtemp(ftemp_pte, func_F, numPointsEval, pointsToEval):
for i in prange(0, numPointsEval):
ftemp_pte[:,i] = np.hstack(func_F(np.vstack(pointsToEval[:,i])))
return ftemp_pte
ftemp_pte= tempFtemp(ftemp_pte, func_F, numPointsEval, pointsToEval)
当我在我的程序中编译它时,我在for i in prange(0, numPointsEval):
行得到错误“non-precise type pyobject”。ftemp_pte
和pointsToEval
都是2d数组,numPointsEval
是整数,func_F
是一个随机函数,它将生成要存储在ftemp_pte[:,i]
中的1d数组
如果您能帮助我们找出导致此错误的原因,我们将不胜感激
[编辑]
我最初使用的顺序代码(有效)如下:
def func_F(x):
f= np.zeros((1,2))
f[0,0]= x[0,0]
n= max(np.size(x,0), np.size(x,1))
g = 1 + 9* np.sum(x[1:n])/(n-1)
h = 1 - np.sqrt(f[0,0]/g)
f[0,1] = g * h
F= np.transpose(f)
return F
for i in range(0, numPointsEval):
ftemp_pte[:,i] = np.hstack(func_F(np.vstack(pointsToEval[:,i])))
我还应该提到,需要使用hstack
和vstack
,以便创建的数组的格式可以匹配ftemp_pte
数组。删除这些说明将导致尺寸不匹配
variavleftemp_pte
始终有2行和x行。正确值的一个示例是 [[0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 0.21875 ] [0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286 0.5397286]]
我的代码的最初目的是将以下Matlab的parfor指令翻译成Python
parfor i=1:numPointsEval
ftemp_pte(:,i) = feval(func_F,pointsToEval(:,i));
任何帮助都将不胜感激
问题2的答案
只要你不是真的堆叠数组,而是重新排列它们,你就应该避免^ {CD1>}和^ {< CD2>},并考虑使用^ {CD3>}或^ {CD4}}。例如:
但是,numba不支持非连续数组上的
reshape()
因此,我已经设法使您的代码运行与numba通过转置一切,以避免重塑数组。以下代码确实有效,可能会给您一些想法:
{a1}表示一级函数对象可以是Numba cfunc编译函数、JIT编译函数和实现包装器地址协议的对象
您可以传递JITted函数,如以下简化示例所示:
这解决了“非精确类型pyobject”的问题,但是我已经从示例中删除了
hstack
和vstack
操作,因为它们产生了their own problems and inefficiencies相关问题 更多 >
编程相关推荐