2017-06-23 59 views
0

我想将Numpy数组列表保存到文件中。名单如下形状:从列表中创建具有不匹配轴> 0大小的列表

my_list = [np.ones((2, 515, 3)), np.ones((2, 853, 3))] 

然而,当我尝试使用np.savez保存,列表试图获取转换为NumPy的阵列。这样做np.array(my_list, dtype='object')给出了错误:

--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-8-6fcbd172df30> in <module>() 
----> 1 np.array([np.ones((2, 515, 3)), np.ones((2, 853, 3))], dtype='object') 

ValueError: could not broadcast input array from shape (2,515,3) into shape (2) 

但是,如果axis=0尺寸不匹配,而不是在axis=1尺寸,如my_list = [np.ones((515, 3)), np.ones((853, 3))]的,我不再出现此错误。

为什么不匹配的轴尺寸会影响物体的Numpy数组的能力?

尽管可以将阵列分解为可保存的格式,但我最感兴趣的是转换失败发生的原因以及如何避开它。

+0

我认为这my_list = [np.ones(2,515,3),np.ones(2,853,3)]不起作用,你看过那些签名吗? np.ones(形状,类型,次序)? – Eliethesaiyan

+0

你试过用这个my_list = [np.ones((2,515,3)),np.ones((2,853,3))] ? – Eliethesaiyan

+0

形状是指定轴的形状,(2是行(轴0,515是列(axis = 1)) – Eliethesaiyan

回答

1
In [77]: my_list = [np.ones((2, 515, 3)), np.ones((2, 853, 3))] 

保存与*args参数,或具有**kwargs字典

In [78]: np.savez('test',*my_list) 
In [79]: ll = np.load('test.npz') 
In [80]: list(ll.keys()) 
Out[80]: ['arr_0', 'arr_1'] 
In [81]: ll['arr_0'].shape 
Out[81]: (2, 515, 3) 
In [82]: ll['arr_1'].shape 
Out[82]: (2, 853, 3) 

或与名为keywarods /字典

In [85]: np.savez('test',x=my_list[0],y=my_list[1]) 

np.savez('test', my_list),首先接通my_list到一个数组 - 或尝试

In [83]: np.array(my_list) 
... 
ValueError: could not broadcast input array from shape (2,515,3) into shape (2) 

当试图从数组列表中创建一个数组时,会有3种可能的结果:更高维数组(如果维数匹配),对象数组(如果维数不匹配)或此错误(如果维数排序匹配)。

对象D型情况下:

In [86]: arr=np.array([np.ones((515, 3)), np.ones((853, 3))]) 
In [87]: arr.shape 
Out[87]: (2,) 
In [88]: arr.dtype 
Out[88]: dtype('O') 

创建一个对象阵列的最可靠的方法是预先分配它

In [90]: arr = np.zeros((2,), object) 
In [91]: arr[...]=my_list 

arr的形状具有相匹配的子列表/阵列的嵌套在my_list,否则你会得到广播错误。加载后可以重新调整arr

+0

有没有办法强制对象的情况呢?这就是我想要做的我的问题,但我似乎做错了 – Seanny123

+1

最可靠的方法是预先分配正确大小和dtype的对象数组,并将列表复制到它。 – hpaulj