簡體   English   中英

從軸大小大於0的軸不匹配的列表中創建ndarray

[英]Create ndarray from list with mismatched axis>0 size

我想將Numpy數組的列表保存到文件中。 該列表具有以下形狀:

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數組的能力?

盡管有一些變通方法可以將數組分解為可保存的格式,但是我最感興趣的是為什么發生轉換失敗以及如何解決它。

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)

或帶有命名的鍵盤提示/字典

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種結果:高維數組(如果尺寸匹配),對象數組(如果尺寸不匹配)或此錯誤(如果尺寸排序匹配) )。

對象dtype的情況:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM