我有一个三维大脑图像的矩阵数组,我正在对这些图像做一些处理。
输入矩阵看起来像MX,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
..。
知道怎么解决这个问题吗?谢谢
发布于 2017-10-14 10:08:15
你需要
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,)]
由于您没有给出所有的示例代码来重现问题,所以我不能说您的处理代码期望的是什么形状。
然后,很明显,"brain:“后面的数字是输入中一行的索引。如果将每个作业作为输入数组的一部分,自然,它们都会产生相同的索引。你需要以某种方式告诉每个作业它的开始指数,这样他们才能正确地计算绝对指数。
https://stackoverflow.com/questions/46742971
复制相似问题