Python:如何保存不同长度的2D numpy数组列表

Python:如何保存不同长度的2D numpy数组列表,python,list,numpy,save,numpy-ndarray,Python,List,Numpy,Save,Numpy Ndarray,我正在尝试将numpy阵列列表保存到磁盘,这样我就不必每次都生成它,因为这需要一段时间。该列表包含约230000个numpy阵列,每个numpy阵列的尺寸为7X长度,其中每个阵列的长度可以在~200-800之间变化 我尝试了np.save,但是我得到一个错误,说“无法将输入数组从形状(7158)广播到形状(7)”列表中第一个数组的长度是158,因此它在第一个列表项失败。我还尝试了np.savez,并且首先使用np.asarray(listname)将数组列表转换为纯numpy数组,但是我得到了相

我正在尝试将numpy阵列列表保存到磁盘,这样我就不必每次都生成它,因为这需要一段时间。该列表包含约230000个numpy阵列,每个numpy阵列的尺寸为7X长度,其中每个阵列的长度可以在~200-800之间变化

我尝试了np.save,但是我得到一个错误,说“无法将输入数组从形状(7158)广播到形状(7)”列表中第一个数组的长度是158,因此它在第一个列表项失败。我还尝试了np.savez,并且首先使用np.asarray(listname)将数组列表转换为纯numpy数组,但是我得到了相同的错误

将此阵列列表保存到磁盘以便我可以按需加载和使用的最佳方法是什么?

(我删除了此答案,因为看到一条评论已经提到将
np.savez
*yourlist
一起使用,但我正在取消删除它,以便提供一个如何重新读取数据的示例。)

给出:

[array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([0, 1, 2, 3, 4])]
尽管从
数据中提取
列表2
的语法有点像字典,但不支持
数据.values()
——尽管
数据.items()
有效,因此您还可以执行以下操作:

list2 = [v for k, v in data.items()]
从实验中可以看出,如果省略
np.savez
上的
.npz
后缀,它将自动追加,但如果省略
np.load
上的后缀,则将找不到该文件。

(我在看到一条评论已经提到将
np.savez
*yourlist
一起使用后删除了这个答案,但我正在取消删除它,以便提供一个如何重新读取数据的示例。)

给出:

[array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([0, 1, 2, 3, 4])]
尽管从
数据中提取
列表2
的语法有点像字典,但不支持
数据.values()
——尽管
数据.items()
有效,因此您还可以执行以下操作:

list2 = [v for k, v in data.items()]

从实验中可以看出,如果您省略
np.savez
上的
.npz
后缀,那么它将自动追加,但是如果您省略
np.load
上的后缀,那么将找不到文件。

包含第二维度不同数组的列表:

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)
保存
有效:

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
是数组在第一维度上不同的示例


基本点是
np。save
写入数组;它尝试将列表输入到数组中。来自不同大小数组的数组会推到
numpy
的边界。最新的1.19版本开始警告我们这一点。

第二维数组的列表:

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)
保存
有效:

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
是数组在第一维度上不同的示例


基本点是
np.save
写入一个数组;它尝试将一个列表输入到数组中。来自不同大小数组的数组会推到
numpy
的边界。最新的1.19版本开始警告我们这一点。

这是
np.array(您的列表)
save
开始时执行的操作。有时它会生成一个对象数据类型数组,但如果第一个维度与该操作匹配,则会产生错误。
np.savez(filename,*yourlist)
应在不首先尝试生成数组的情况下处理保存操作。您还可以将其保存为JSON格式(并可选择压缩)。这是
np.array(您的_列表)
操作在
save
的开头。有时它会生成一个对象数据类型数组,但如果第一个维度与该操作匹配,则会产生错误。
np.savez(filename,*yourlist)
应该在不首先尝试创建数组的情况下处理保存。您还可以将它们保存为JSON格式(并可选择压缩)。