[英]Python: How to save lists of 2D numpy arrays of different lengths
我正在尝试将 numpy arrays 的列表保存到磁盘,因此我不必每次都生成它,因为这需要一段时间。 该列表包含大约 230,000 个 numpy arrays,每个 numpy 数组的维度为 7xlength,其中每个数组的长度可以在 ~200-80 之间变化。
我试过 np.save 但我收到一条错误消息,提示“无法将输入数组从形状 (7,158) 广播到形状 (7)”列表中第一个数组的长度为 158,因此它在第一个列表项处失败。 我也尝试过 np.savez 并首先使用 np.asarray(listname) 将 arrays 列表转换为纯 numpy 数组,但我得到了同样的错误。
将此 arrays 列表保存到磁盘以便我可以按需加载和使用的最佳方法是什么?
arrays 的列表在第二维不同:
In [118]: alist = [np.ones((2,3)), np.zeros((2,5)), np.arange(12).reshape(2,6)]
你的错误:
In [119]: np.array(alist, dtype=object)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-119-357020ce4a02> in <module>
----> 1 np.array(alist, dtype=object)
ValueError: could not broadcast input array from shape (2,3) into shape (2)
制作 object 阵列的正确方法:
In [120]: arr = np.empty(3, object)
In [121]: arr[:] = alist
In [122]: arr
Out[122]:
array([array([[1., 1., 1.],
[1., 1., 1.]]),
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]),
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11]])], dtype=object)
save
作品:
In [123]: np.save('test.npy', arr)
In [124]: ll test.npy
-rw-rw-r-- 1 paul 708 Jul 8 20:13 test.npy
savez
工作,具有几乎相同的净文件大小:
In [125]: np.savez('test.npz', *arr)
In [126]: ll test.npz
-rw-rw-r-- 1 paul 972 Jul 8 20:13 test.npz
为什么 numpy.save 为 sys.getsizeof 0.33MB 数据生成 100MB 文件? 是 arrays 在第一个维度上不同的示例。
基本点是np.save
写入一个数组; 它试图将列表输入到数组中。 来自 arrays 的不同大小的数组推动了numpy
的边界。 最新的 1.19 版本开始向我们发出警告。
(在看到评论已经提到使用np.savez
和*yourlist
后,我删除了这个答案,但我取消删除它是为了提供一个如何再次读回数据的示例。)
import numpy as np
list1 = [np.zeros((3,3)), np.arange(5)]
np.savez("myfile.npz", *list1)
data = np.load("myfile.npz")
list2 = [data[k] for k in data]
print(list2)
给出:
[array([[ 0., 0., 0.],
[ 0., 0., 0.],
[ 0., 0., 0.]]), array([0, 1, 2, 3, 4])]
尽管从data
中提取list2
的语法有点像字典,但不支持data.values()
() ——尽管data.items()
是有效的,所以你也可以这样做:
list2 = [v for k, v in data.items()]
从实验来看,如果您在np.savez
上省略.npz
后缀,那么它将自动附加,但如果您在np.load
上省略后缀,则将找不到该文件。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.