我有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以及如何解决此问题?
答案 0 :(得分:7)
您对meshgrid
的调用需要大量内存 - 它会生成两个8823 * 8823浮点数组。每个都约为0.6 GB。
但是你的屏幕无法显示(并且你的眼睛无法真正处理)那么多的信息,所以你应该想到一种方法来将数据平滑到像1024 * 1024这样更合理的东西,然后再执行这一步骤
答案 1 :(得分:1)
和较新的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)