使用multiprocessing.Pool时,imshow()返回2D数组的无效尺寸

时间:2017-04-28 00:37:28

标签: python arrays matplotlib multiprocessing imshow

我尝试使用多处理模块更快地从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)

1 个答案:

答案 0 :(得分:0)

foreach()迭代pool.map(func, iterable[, chunksize])。因此,如果da是像da那样的二维数组。每个流程的[[1,2],[3,4]]功能输入为__main__[1,2]

我不确定你想做什么,所以如果你真的想得到一个完整的帮助,你可以上传你的可执行项目(到github或别的什么,等等),我会检查。