python - (Python) numpy genfromtxt 转换问题
问题描述
我用
netdata = num.genfromtxt('resultscut.rw', dtype=None, delimiter = '|', usecols=(0,1,2,3,4))
从文本数据文件中生成列表。这真的很好但是当我把一个更大的数据文件转换我得到这个错误:
File "/home/.local/lib/python2.7/site-packages/numpy/lib/npyio.py", line 2047, in genfromtxt
for (i, conv) in enumerate(converters)]))
MemoryError
genfromtxt 是不是太大了?我该如何解决?
提前谢谢你,问候:)
解决方案
正如评论中所讨论的,生成的对象可能对您的记忆来说太大了。
Numpy 能够在您的磁盘上存储阵列(希望 SSD,如果您使用 HDD,这可能会太慢)。这称为memmap。
可以在 memmap 中存储诸如字符串之类的数据类型,但这可能会变得很棘手:numpy.memmap 用于字符串数组?
此外,首先将数据放入 memmap 可能会很复杂。您可能想要拆分文件并多次加载它。然后您可以将各个部分一一写入memmap。
另一个重要的点可能是dtype
. 您指定None
并使用许多列。您在不同的列中有不同的数据类型吗?如果是,您可能想切换到pandas,而不是 numpy。这将为您提供此电子表格(如数据)的正确数据类型。确保为每一列使用适当的数据类型。这可以显着减少您的内存占用(并且可能已经解决了您的问题):https ://www.dataquest.io/blog/pandas-big-data/
要检查 numpy 数组的内存占用,您可以使用nbytes
:
np.ones((10,10), dtype="float64").nbytes # 800
np.ones((10,10), dtype="int32").nbytes # 400
推荐阅读
- scala - 如何在 Scala 3 中声明并将参数传递给隐式参数?
- python - “utf-8”编解码器无法解码位置 107 中的字节 0x92:无效的起始字节
- haskell - 如何编写一个计算一个单词的字母数量并将其打印为一对元音的函数?
- c# - 在 docker 镜像中找不到 CMake 没有 CSharp 编译器
- c# - 对象数组中的 NullReferenceException
- if-statement - check (char a) 语句有问题(使用 if 运算符)
- postgresql - 如何实现“类型是
postgresql 中的“rowid 索引表”概念,用于将表数据与新插入的数据进行比较 - vue.js - Vue I18n HTML 插值
- c# - C# 任务 - 聚合异常
- sql - 具有级联命名空间的 SQL Server Xml 查询