簡體   English   中英

NumPy:將'np.save()'與'allow_pickle = False'一起使用的后果

[英]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數組,其中dtypeobject ; 如果數組的內容不是正常的數字類型(如intfloat等),就會發生這種情況。 我們可以試着用對象保存一個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.

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