运行Numpy Meshgrid时出现MemoryError

时间:2010-03-17 08:02:13

标签: python arrays numpy

我有x,y坐标的 8823 数据点。我试图按照how to get a scatter dataset to be represented as a heatmap的答案,但是当我浏览

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)

我的阵列有问题吗?这个代码在放入this example时有效,但我不太确定。

为什么我会收到此MemoryError以及如何解决此问题?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:1)

numpy 1.7.0中的

和较新的meshgrid具有sparse关键字参数。设置稀疏网格网格,以便在使用时广播到完整的网格网格。这可以节省大量内存,例如当使用meshgrid索引数组时。

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]])]

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

np.meshgrid(np.arange(10).astype(np.int8), np.arange(10).astype(np.int8),
            sparse=True, copy=False)

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

答案 2 :(得分:0)

当调用np.meshgrid进行散点图处理时,如果数据太大而无法处理,则需要对其进行规范化处理,请尝试使用此模块

    # Feature Scaling
from sklearn.preprocessing import StandardScaler
st = StandardScaler()
X = st.fit_transform(X)