![](/img/trans.png)
[英]Why np.arrays and lists work with `allow_pickle=False`, but dictionaries do not?
[英]NumPy: consequences of using 'np.save()' with 'allow_pickle=False'
根據這里的 NumPy文檔,默認情況下,使用allow_pickle=True
保存矩陣,此外,它們告訴這個默認行為可能有問題:
allow_pickle:bool,可選
允許使用Python pickles保存對象數組。 禁止泡菜的原因包括安全性(加載腌制數據可以執行任意代碼)和可移植性(腌制對象可能無法在不同的Python安裝上加載,例如,如果存儲的對象需要不可用的庫,並且並非所有的pickle數據都兼容Python 2和Python 3)。
默認值:True
閱讀之后,我當然更喜歡使用allow_pickle=False
- 但是當它以這種方式使用時它們並沒有告訴它們有什么不同。 必須有一些理由他們默認使用allow_pickel=True
,盡管它有缺點。
你能告訴我你是否使用allow_pickle=False
以及它的行為方式有何不同?
對象數組只是一個普通的numpy數組,其中dtype
是object
; 如果數組的內容不是正常的數字類型(如int
或float
等),就會發生這種情況。 我們可以試着用對象保存一個numpy數組,只是為了測試它是如何工作的。 一個簡單的對象將是一個dict
:
>>> import numpy as np
>>> a = np.array([{x: 1} for x in range(4)])
>>> a
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object)
>>> np.save('test.pkl', a)
裝回這個工作正常:
>>> np.load('test.pkl.npy')
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object)
但是,如果不使用pickle,則無法保存數組:
>>> np.save('test.pkl', a, allow_pickle=False)
...
ValueError: Object arrays cannot be saved when allow_pickle=False
泡菜的經驗法則是,如果你正在加載你制作的泡菜,那么你是安全的,但你應該小心加載從其他地方獲得的泡菜。 首先,如果你沒有安裝用於制作pickle的相同庫(或庫版本),你可能無法加載pickle(這就是上面的可移植性意味着什么)。 安全是另一個潛在的問題; 例如,您可以閱讀一些關於如何在本文中濫用泡菜的內容 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.