numpy 保存/加载损坏数组
Posted
技术标签:
【中文标题】numpy 保存/加载损坏数组【英文标题】:numpy save/load corrupting an array 【发布时间】:2012-09-24 16:13:06 【问题描述】:我正在尝试保存一个大型 numpy 数组并重新加载它。使用numpy.save
和numpy.load
,数组值被破坏/改变。数组预保存和加载后的形状和数据类型是相同的,但加载后数组的绝大多数值都归零。
数组是 (22915,22915),值是 float64,将 3.94 gb 作为 .npy 文件,数据条目平均约为 0.1(不是可能合理转换为零的微小浮点数)。我正在使用 numpy 1.5.1。
任何有关为什么会发生这种损坏的帮助将不胜感激,因为我不知所措。下面是一些提供上述声明证据的代码。
In [7]: m
Out[7]:
array([[ 0. , 0.02023, 0.00703, ..., 0.02362, 0.02939, 0.03656],
[ 0.02023, 0. , 0.0135 , ..., 0.04357, 0.04934, 0.05651],
[ 0.00703, 0.0135 , 0. , ..., 0.03037, 0.03614, 0.04331],
...,
[ 0.02362, 0.04357, 0.03037, ..., 0. , 0.01797, 0.02514],
[ 0.02939, 0.04934, 0.03614, ..., 0.01797, 0. , 0.01919],
[ 0.03656, 0.05651, 0.04331, ..., 0.02514, 0.01919, 0. ]])
In [8]: m.shape
Out[8]: (22195, 22195)
In [12]: save('/Users/will/Desktop/m.npy',m)
In [14]: lm = load('/Users/will/Desktop/m.npy')
In [15]: lm
Out[15]:
array([[ 0. , 0.02023, 0.00703, ..., 0. , 0. , 0. ],
[ 0. , 0. , 0. , ..., 0. , 0. , 0. ],
[ 0. , 0. , 0. , ..., 0. , 0. , 0. ],
...,
[ 0. , 0. , 0. , ..., 0. , 0. , 0. ],
[ 0. , 0. , 0. , ..., 0. , 0. , 0. ],
[ 0. , 0. , 0. , ..., 0. , 0. , 0. ]])
In [17]: type(lm[0][0])
Out[17]: numpy.float64
In [18]: type(m[0][0])
Out[18]: numpy.float64
In [19]: lm.shape
Out[19]: (22195, 22195)
【问题讨论】:
您尝试过,或者能够尝试新版本的 Numpy 吗? 我不能——1.5.1 是我正在使用的其他库的依赖项。如果它在更新版本中得到修复(在我进行的搜索中有一些证据),那么也许我可以尝试升级,但显然这可能会导致更多/其他问题。 几件事要尝试:1)查找数组变为零的位置,2)尝试单独打印出数组的最后一行/列(看看它是否可能是一个奇怪的打印问题),3)尝试通过将'r'
指定为load
的第二个参数来使用内存映射。
这不是打印问题,但 'r' 标志有效。我尝试了其他一些 map_mode 选项,但它们没有解决问题,所以我放弃了这种方法。非常感谢您的帮助!至于为什么不使用 map_mode 加载不起作用,您认为直接加载到 python 中的数组有最大限制吗?
@wdwvt1 您是否测试过这些值是否实际上为零?我问是因为我在 Pandas 中遇到了一个错误,它显示小于 0 的浮点数为 0.
,即使它们在内存中正确表示。
【参考方案1】:
这是一个已知的issue(请注意,该链接针对 numpy 1.4)。如果您真的无法升级,我的建议是尝试以不同的方式保存(savez、savetxt)。如果 getbuffer 可用,您可以尝试直接写入字节。如果一切都失败了(并且你无法升级),你可以很容易地编写自己的保存函数。
【讨论】:
以上是关于numpy 保存/加载损坏数组的主要内容,如果未能解决你的问题,请参考以下文章