2017-06-23 50 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