运行Numpy Meshgrid时出现MemoryError

gre*_*eye 4 python arrays numpy

我有8823个数据点,x,y坐标.我正在尝试按照如何将散点数据集表示为热图的答案,但是当我通过

X, Y = np.meshgrid(x, y)

我得到的数据数组指令MemoryError.我是numpy和matplotlib的新手,我基本上试图通过调整我能找到的例子来运行它.

这是我如何从存储它们的文件构建我的数组:

XY_File = open ('XY_Output.txt', 'r')
XY = XY_File.readlines()
XY_File.close()

Xf=[]
Yf=[]
for line in XY:
    Xf.append(float(line.split('\t')[0]))
    Yf.append(float(line.split('\t')[1]))
x=array(Xf)
y=array(Yf)
Run Code Online (Sandbox Code Playgroud)

我的阵列有问题吗?这个相同的代码在这个例子中有用,但我不太确定.

为什么我得到这个MemoryError,我该如何解决这个问题?

jta*_*lor 8

在 numpy 1.7.0 及更高版本中meshgrid具有sparse关键字参数。设置稀疏网格,以便在使用时广播到完整网格。这可以节省大量内存,例如当使用网格网格来索引数组时。

In [2]: np.meshgrid(np.arange(10), np.arange(10), sparse=True)
Out[2]: 
[array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]]), array([[0],
    [1],
    [2],
    [3],
    [4],
    [5],
    [6],
    [7],
    [8],
    [9]])]
Run Code Online (Sandbox Code Playgroud)

另一种选择是使用仍然能够表示范围的较小整数:

np.meshgrid(np.arange(10).astype(np.int8), np.arange(10).astype(np.int8),
            sparse=True, copy=False)
Run Code Online (Sandbox Code Playgroud)

尽管从 numpy 1.9 开始,使用这些较小的整数进行索引会更慢,因为它们会在内部转换回较小(np.setbufsize 大小)块中的较大整数。


And*_*ffe 7

您的调用meshgrid需要大量内存 - 它会生成两个8823*8823浮点数组.它们每个约为0.6 GB.

但是你的屏幕无法显示(并且你的眼睛无法真正处理)那么多的信息,所以你应该想到一种方法来平滑你的数据,使其更加合理,比如1024*1024,然后再执行这一步骤.