首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python:如何保存不同长度的二维numpy数组列表

Python:如何保存不同长度的二维numpy数组列表
EN

Stack Overflow用户
提问于 2020-07-09 08:25:47
回答 2查看 816关注 0票数 0

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2020-07-09 11:18:17

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

代码语言:javascript
运行
复制
In [118]: alist = [np.ones((2,3)), np.zeros((2,5)), np.arange(12).reshape(2,6)]                      

你的错误:

代码语言:javascript
运行
复制
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)

制作对象数组的正确方法:

代码语言:javascript
运行
复制
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的工作方式:

代码语言:javascript
运行
复制
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可以工作,但网络文件大小几乎相同:

代码语言:javascript
运行
复制
In [125]: np.savez('test.npz', *arr)                                                                 
In [126]: ll test.npz                                                                                
-rw-rw-r-- 1 paul 972 Jul  8 20:13 test.npz

Why does numpy.save produce 100MB file for sys.getsizeof 0.33MB data?是一个例子,其中数组在第一维上是不同的。

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

票数 2
EN

Stack Overflow用户

发布于 2020-07-09 09:41:37

(在看到一条评论已经提到在*yourlist__中使用np.savez后,我删除了这个答案,但为了提供一个如何再次读回数据的示例,我将其删除。)

代码语言:javascript
运行
复制
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)

提供:

代码语言:javascript
运行
复制
[array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([0, 1, 2, 3, 4])]

尽管使用类似字典的语法从data中提取list2,但不支持data.values() --尽管data.items()是有效的,因此您也可以这样做:

代码语言:javascript
运行
复制
list2 = [v for k, v in data.items()]

根据实验,如果您在np.savez上省略了.npz后缀,那么它将被自动追加,但是如果您在np.load上省略了后缀,那么将找不到该文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62805566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档