运行Numpy Meshgrid时出现MemoryError

7 投票
3 回答
15015 浏览
提问于 2025-04-15 20:30

我有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)

我的数组有什么问题吗?同样的代码在这个例子中是可以运行的,但我不太确定。

为什么会出现这个MemoryError,我该怎么解决呢?

3 个回答

0

当你使用np.meshgrid来绘制散点图时,如果你的数据太大,处理起来会很困难,这时候你需要对数据进行归一化处理,可以试试这个模块。

    # Feature Scaling
from sklearn.preprocessing import StandardScaler
st = StandardScaler()
X = st.fit_transform(X)
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]])]

另外一个选择是使用更小的整数,这些整数仍然可以表示所需的范围:

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

不过,从numpy 1.9开始,使用这些小整数进行索引会变得比较慢,因为它们在内部会被转换回更大的整数,而且这个过程是分块进行的(每块大小为np.setbufsize)。

8

你调用的 meshgrid 函数需要占用很多内存,因为它会生成两个大小为 8823*8823 的浮点数组。每个数组大约占用 0.6 GB 的空间。

不过,你的屏幕其实也显示不了这么多信息,而且你的眼睛也处理不了这么多数据,所以在进行这个步骤之前,最好考虑把数据处理得更简单一些,比如调整到 1024*1024 的大小。

撰写回答