簡體   English   中英

Python:如何保存不同長度的二維 numpy arrays 列表

[英]Python: How to save lists of 2D numpy arrays of different lengths

我正在嘗試將 numpy arrays 的列表保存到磁盤,因此我不必每次都生成它,因為這需要一段時間。 該列表包含大約 230,000 個 numpy arrays,每個 numpy 數組的維度為 7xlength,其中每個數組的長度可以在 ~200-80 之間變化。

我試過 np.save 但我收到一條錯誤消息,提示“無法將輸入數組從形狀 (7,158) 廣播到形狀 (7)”列表中第一個數組的長度為 158,因此它在第一個列表項處失敗。 我也嘗試過 np.savez 並首先使用 np.asarray(listname) 將 arrays 列表轉換為純 numpy 數組,但我得到了同樣的錯誤。

將此 arrays 列表保存到磁盤以便我可以按需加載和使用的最佳方法是什么?

arrays 的列表在第二維不同:

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)

制作 object 陣列的正確方法:

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作品:

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

為什么 numpy.save 為 sys.getsizeof 0.33MB 數據生成 100MB 文件? 是 arrays 在第一個維度上不同的示例。

基本點是np.save寫入一個數組; 它試圖將列表輸入到數組中。 來自 arrays 的不同大小的數組推動了numpy的邊界。 最新的 1.19 版本開始向我們發出警告。

(在看到評論已經提到使用np.savez*yourlist后,我刪除了這個答案,但我取消刪除它是為了提供一個如何再次讀回數據的示例。)

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)

給出:

[array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]]), array([0, 1, 2, 3, 4])]

盡管從data中提取list2的語法有點像字典,但不支持data.values() () ——盡管data.items()是有效的,所以你也可以這樣做:

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

從實驗來看,如果您在np.savez上省略.npz后綴,那么它將自動附加,但如果您在np.load上省略后綴,則將找不到該文件。

暫無
暫無

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

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