ValueError:数组太大 - 无法理解如何解决这个问题

Posted

技术标签:

【中文标题】ValueError:数组太大 - 无法理解如何解决这个问题【英文标题】:ValueError: array is too big - cannot understand how to fix this 【发布时间】:2014-03-07 04:19:45 【问题描述】:

我运行以下代码:

traindata = trainData.read_csv('train.tsv', delimiter = '\t')

调用这个函数:

def read_csv(self, filename, delimiter = ',', quotechar = '"'):
    # open the file
    reader = csv.reader(open(filename, 'rb'), delimiter = delimiter, quotechar = quotechar)
    # read first line and extract its data 
    self.column_headings = np.array(next(reader))
    # read subsequent lines
    rows = []
    for row in reader:
        rows.append(row)
    self.data = np.array(rows)
    self.m, self.n = self.data.shape

这样我就可以打电话了

m, n = traindata.data.shape
print m, n, traindata.column_headings

不幸的是,在我调用 read_csv 函数时,我得到了错误:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-74-1cc5776f9a9c> in <module>()
     13 print "loading data.."
     14 
---> 15 traindata = trainData.read_csv('test.tsv', delimiter = '\t')
     16 
C:\pc in read_csv(self, filename, delimiter, quotechar)
     17         for row in reader:
     18             rows.append(row)
---> 19         self.data = np.array(rows)
     20         self.m, self.n = self.data.shape
     21 

ValueError: array is too big.

如何解决此问题并允许代码运行?

编辑:数据是一个 .tsv 文件,extract here.

【问题讨论】:

您的文件有多大? rowslen 是什么?如果数据太大而无法一次性完成,您可能需要拆分数据或使用 pytables 或 pandas 之类的东西。您的数据绝对看起来可以放入某种数据库中。 @jozzas 21MB,7395 行,每行 27 列。我认为 numpy 会处理这些更大的值? numpy 可以加载您的数据提取,还是仅在完整文件上失败? @jozzas 它只会在完整文件上失败,但我看不到任何解决方法:( 尝试在您的数组调用中使用dtype=objectself.data = np.array(rows, dtype=object)。 Numpy 正在尝试创建一些它不需要的非常大的字符串 - 这会将它们保留为引用的 python 对象。 【参考方案1】:

Numpy 正在创建一个巨大的字符串数组,每个字符串的长度都设置为该列中任何一个字符串的最大长度,并且您可能在这个巨大的内存分配过程中耗尽了内存。

通过做

self.data = np.array(rows, dtype=object) 

numpy 不需要为字符串对象分配大块新内存 - dtype=object 告诉 numpy 将其数组内容保留为对现有 python 对象的引用(字符串已经存在于你的 python 列表 rows 中),并且这些指针占用的空间比字符串对象少得多。

【讨论】:

以上是关于ValueError:数组太大 - 无法理解如何解决这个问题的主要内容,如果未能解决你的问题,请参考以下文章

无法将列表转换为数组:ValueError:只有一个元素张量可以转换为 Python 标量

如何解决:ValueError:输入包含 NaN、无穷大或对于 dtype('float32') 来说太大的值?

在 for 循环中使用 str.split 时出现“ValueError 太多值无法解包”

如何将 RGB ImageItem 添加到 pyqtgraph ViewBox? ValueError:无法将输入数组从形状(256,256,4)广播到形状(256,256)

ValueError: X 必须是 NumPy 数组

ValueError:无法重塑大小为 0 的数组