我尝试使用多处理模块更快地从2D阵列创建图形。在下面的代码中,我从hdf5数据文件创建一个2D数组(如果您想要测试的示例文件,请给我发消息)。使用multiprocessing.Pool
,我尝试将此数组传递给map
函数,但它会引发TypeError: Invalid dimensions for image data
。我已经检查过使用da.shape
确保我的数组是2维,所以我不确定它为什么不能为我工作。任何帮助深表感谢!
要import yt
,请参阅yt-project.org/#getyt。
P.S。这是我关于Stack Overflow的第一个问题所以请告诉我是否/如何改进。
import yt
import numpy as np
import multiprocessing
from multiprocessing import Pool, Process, Array
fl_nm = raw_input("enter filename: ").strip()
level = int(raw_input("resolution level: ").strip())
ds = yt.load(fl_nm)
all_data_level_x = ds.covering_grid(level=level,left_edge=[-3.70281620e+21,0.00000000e+00,-3.70281620e+21],dims=ds.domain_dimensions*2**level)
disp_array = []
for x in xrange(0,16*2**level):
vbin = []
for z in xrange(0,80*2**level):
v = []
for y in xrange(0,8*2**level):
vel = all_data_level_x["velocity_magnitude"][x,y,z].in_units("km/s")
v.append(vel)
sigma = np.sqrt(np.sum((v - np.mean(v))**2) / np.size(v))
vbin.append(sigma)
disp_array.append(vbin)
print "{0:.1f} %".format((x+1)*100/float(16*2**level))
da = np.array(disp_array)
print "fixed resolution array created"
def __main__(data_array):
import matplotlib
matplotlib.use('Agg')
from matplotlib import pyplot as plt
plt.imshow(data_array, origin = "lower", aspect = "equal", extent=[-1.2,10.8,-1.2,1.2])
plt.colorbar(fraction=0.046, pad=0.04)
print "plot created. Saving figure..."
fig_nm = 'velocity_disp_{0}_lvl_{1}.png'.format(fl_nm[-4:],level)
plt.savefig(fig_nm)
plt.close()
print "File saved as: " + fig_nm
return
pool = multiprocessing.Pool(4)
pool.map(__main__,da)
答案 0 :(得分:0)
foreach()
迭代pool.map(func, iterable[, chunksize])
。因此,如果da
是像da
那样的二维数组。每个流程的[[1,2],[3,4]]
功能输入为__main__
和[1,2]
。
我不确定你想做什么,所以如果你真的想得到一个完整的帮助,你可以上传你的可执行项目(到github或别的什么,等等),我会检查。