我正在尝试使用python中的csv模块处理从csv文件获取的数据。有大约50列&这里有401125行。我使用以下代码块将该数据放入列表
csv_file_object = csv.reader(open(r'some_path\Train.csv','rb'))
header = csv_file_object.next()
data = []
for row in csv_file_object:
data.append(row)
我可以使用len(数据)&获取此列表的长度它返回401125.我甚至可以通过调用列表索引来获取每个单独的记录。 但是当我尝试通过调用np.size(data)来获取列表的大小时(我将numpy导入为np),我得到了以下堆栈跟踪。
MemoryError Traceback(最近一次调用 最后)in() ----> 1 np.size(数据)
C:\ Python27 \ lib \ site-packages \ numpy \ core \ fromnumeric.pyc的大小(a, 轴)2198返回a.size 2199除外 AttributeError的: - > 2200返回asarray(a).size 2201 else:2202尝试:
asarray中的C:\ Python27 \ lib \ site-packages \ numpy \ core \ numeric.pyc(a, dtype,order) 233 234“”“ - > 235返回数组(a,dtype,copy = False,order = order) 236 237 def asanyarray(a,dtype = None,order = None):
的MemoryError:
我甚至无法使用列表索引将该列表分成多个部分,或者将此列表转换为numpy数组。它给出了同样的内存错误。
我该如何处理这种大数据样本。有没有其他方法来处理像这样的大数据集。
我在windows 7 professional中使用ipython notebook。
答案 0 :(得分:12)
正如@DSM在评论中所指出的,你收到内存错误的原因是在列表上调用np.size
会先将数据复制到数组中,然后再获取大小。
如果您不需要将其作为numpy数组使用,请不要调用np.size
。如果你确实想要类似numpy的索引选项,那么你有几个选择。
你可以使用pandas,它用于处理大型不一定数值的数据集,并且有一些很棒的帮助器和东西。
如果你不想这样做,你可以定义一个numpy structure array并在第一个地方逐行填充它,而不是制作一个列表并复制到它中。类似的东西:
fields = [('name1', str), ('name2', float), ...]
data = np.zeros((num_rows,), dtype=fields)
csv_file_object = csv.reader(open(r'some_path\Train.csv','rb'))
header = csv_file_object.next()
for i, row in enumerate(csv_file_object):
data[i] = row
您还可以根据fields
定义header
,这样您就不必手动输入所有50个列名,但您必须为每个列指定数据类型。