代码:
import scipy as sp
import matplotlib.pyplot as plt
data=sp.genfromtxt("data/train.tsv", delimiter ="\t", dtype="string", comments=None, skip_header=1)
x = data[:,0]
y = data[:,1]
x = x[~sp.isnan(y)]
y = x[~sp.isnan(y)]
DataOfInterest=x["avglinksize"]
EphemeralOrEvergreen=x["label"]
plt.scatter(DataOfInterest,EphemeralOrEvergreen)
plt.title("Training data")
plt.xlabel("Single feature from training set")
plt.ylabel("Ephemeral or Evergreen")
plt.grid()
plt.show()
输出:
python GenGraphs.py
Traceback (most recent call last):
File "GenGraphs.py", line 4, in <module>
data=sp.genfromtxt("data/train.tsv", delimiter ="\t", dtype="string", comments=None, skip_header=1)
File "/usr/lib/python2.7/dist-packages/numpy/lib/npyio.py", line 1746, in genfromtxt
output = np.array(data, dtype)
MemoryError
我正在尝试将tsv文件中的一列映射到另一列。
我在这里误解了什么?我怎么能这样做?
答案 0 :(得分:0)
Python内存不足,因为您尝试创建的对象很简单。原因是您的数据包含一些非常大的字符串(请注意上一个问题)。
您创建的数组data
只有一个dtype
。选择此dtype的大小足以容纳数据中最长的字符串。但无论其他内容如何,对于数据中的每个字段,都会分配相同数量的内存!因此,数组内存中的大小可能会比数据文件大小大得多!
作为一种解决方案,您可以为每列指定dtype,但更容易的是只加载您实际需要的数据:
data = sp.genfromtxt('data/train.tsv',
delimiter ='\t',
names=True,
usecols='avglinksize','label'))
答案 1 :(得分:0)
您可以使用np.memmap
加载它,这将要求您大约70MB:
import numpy as np
with open('train.tsv') as f:
mm = np.memmap('test.memmap', shape=(7395, 27), dtype='|S4000', mode='w+')
f.next()
for i, l in enumerate(f):
mm[i,:] = l.strip().replace('"','').split('\t')
使用m
删除del m
或关闭Python控制台时,将保存文件。也许您必须在创建文件后将模式更改为r+
。
您可以使用memmap数组,就像它是一个普通数组一样,这样您就可以只获取感兴趣的部分。