python - Numba- 用多维数组并行化 For 循环
问题描述
我正在尝试用 numba 并行化 for 循环。我是这个库的新手,但经过一些研究,我制作了这段代码,与我研究的示例相比,它看起来是正确的:
@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)
当我在我的程序思想中编译它时,我在该行收到错误“non-precise type pyobject” for i in prange(0, numPointsEval):
。ftemp_pte
和都是pointsToEval
2d 数组,numPointsEval
是一个整数并且func_F
是一个随机函数,它将生成要存储在ftemp_pte[:,i]
.
任何有关如何找出导致此错误的原因的帮助将不胜感激。
[编辑]
我最初拥有的顺序代码(有效)如下:
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
and 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。
只要您不是真正堆叠数组,而是重塑它们,您就应该避免hstack()
andvstack()
并考虑使用reshape()
or ravel()
。这种方式例如:
ftemp_pte[:, i] = func_F(pointsToEval[:, i].reshape(1, -1)).ravel()
但是,reshape()
numba 不支持在非连续数组上。
因此,我设法通过转置所有内容以避免重塑数组,从而使您的代码使用 numba 运行。以下代码确实有效,可能会给您一些想法:
@nb.njit
def func_F(x):
f = np.zeros(2) # Simple 1d array
f[0] = x[0]
n = max(x.shape)
g = 1 + 9 * np.sum(x[1:n]) / (n - 1)
h = 1 - np.sqrt(f[0] / g)
f[1] = g * h
return f
@nb.njit(parallel=True)
def tempFtemp(ftemp_pte, func_F, numPointsEval, pointsToEval):
for i in nb.prange(numPointsEval):
ftemp_pte[i] = func_F(pointsToEval[i])
return ftemp_pte
ftemp_pte = np.zeros((2, 5)).T
pointsToEval = np.zeros((2, 5)).T
numPointsEval = 5
ftemp_pte = tempFtemp(ftemp_pte, func_F, numPointsEval, pointsToEval)
print(ftemp_pte.T)
推荐阅读
- git - git: 'remote-addhttps' 不是 git 命令。见'git --help'
- deep-learning - 在自定义数据集的 yolo 训练期间重写框是什么意思?
- c++ - 两个链表的交点
- python - 多渠道漏斗 API - 未知 API 或版本
- javascript - 使用 vue js 进行网页抓取
- c++ - x86 中的下划线前缀问题:从 C++ 函数调用 NASM 函数在 x64 中有效,但在 x86 中失败
- python - ValueError:您传递给模型的 Numpy 数组列表不是模型预期的大小
- java - 将单个 Spring bean 实例注入实用程序类的静态变量
- javascript - 在 Jupyter 笔记本中运行的单元格期间,pandas 表中的变量未更新:从 javascript 调用 python 函数时出现问题
- memurai - 是否有免费(非试用)版本的 Memurai?