我有一个3D脑图像的矩阵阵列,我正在对这些图像进行一些处理。
输入矩阵看起来像M [X,Y]:其中X是大脑id,Y是我稍后重新塑造它的数据
以下顺序代码完美地完成:
def transform(X):
data = np.reshape(X, (-1, 176, 208, 176))
data_cropped = np.empty((data.shape[0], 90, 100, 70))
for idx in range(0, data.shape[0]):
data_cropped[idx, :, :, :] = data[idx, 40:130, 40:140, 50:120]
data_cropped = perm(data_cropped)
#data_cropped = impute_data(data_cropped)
data_cropped = np.reshape(data_cropped, (data_cropped.shape[0], -1))
#data_cropped = data_cropped[:, np.apply_along_axis(np.count_nonzero, 0, data_cropped) != 0]
return data_cropped
X_train = np.load("./data_original/X_train.npy")
X_crop = transform(X_train)
顺序运行时此代码部分的输出(循环正常)为:
大脑:0
大脑:1 大脑:2 大脑:3...
问题在于处理所有大脑需要很长时间(约60分钟)。
我试图让代码并行运行,但我无法处理所有的大脑!只有大脑0被处理多次。
我尝试并行化代码:
num_cores = multiprocessing.cpu_count()
X_train = np.load("./data_original/X_train.npy")
X_crop = Parallel(n_jobs=num_cores)(delayed(transform)(i) for i in X_train)
但我得到了这个结果:
大脑:0
大脑:0
大脑:0
大脑:0
...
知道如何解决这个问题吗? 感谢
答案 0 :(得分:0)
你需要
for i in X_train
生成X_train
行(沿着第一维),一次一行,并且它们的一维比初始数组小:
In [7]: a=np.random.random((2,10))
In [10]: a.shape
Out[10]: (2, 10)
In [11]: [i.shape for i in a]
Out[11]: [(10,), (10,)]
由于您没有提供所有示例代码来重现问题,因此我无法说出您的处理代码所期望的形状。
然后,显然,"大脑之后的数字:"是输入中行的索引。如果你为每个作业提供输入数组的一部分,那么它们都会产生相同的索引。你需要以某种方式告诉每个工作它的凝视指数,以便他们正确计算绝对指数。