2017-01-17 6 views
6

NumPy प्रलेखन here के अनुसार के साथ प्रयोग के परिणामों, डिफ़ॉल्ट रूप से, एक मैट्रिक्स allow_pickle=True साथ सहेजा गया है, और इसके अलावा, वे बताते हैं कि इस डिफ़ॉल्ट व्यवहार के साथ समस्याग्रस्त किया जा सकता :NumPy: 'np.save()' 'allow_pickle = झूठी'

allow_pickle: bool, वैकल्पिक
अजगर अचार का उपयोग कर वस्तु सरणियों बचत की अनुमति दें। अचारों को अस्वीकार करने के कारणों में सुरक्षा शामिल है (मसालेदार डेटा लोड करना मनमानी कोड निष्पादित कर सकता है) और पोर्टेबिलिटी (मसालेदार ऑब्जेक्ट्स अलग पायथन इंस्टॉलेशन पर लोड करने योग्य नहीं हो सकते हैं, उदाहरण के लिए यदि संग्रहीत वस्तुओं को पुस्तकालयों की आवश्यकता होती है जो उपलब्ध नहीं हैं, और सभी मसालेदार डेटा के बीच संगत नहीं है पायथन 2 और पायथन 3)।
डिफ़ॉल्ट: यह सच है

यह पढ़ने के बाद, मैं निश्चित रूप से allow_pickle=False का उपयोग करना चाहते हैं - लेकिन वे नहीं बताया कि क्या अलग है जब यह इस तरह से किया जाता है। इसके नुकसान के बावजूद डिफ़ॉल्ट रूप से allow_pickel=True का उपयोग करने के कुछ कारण होने चाहिए।

क्या आप कृपया बता सकते हैं कि आप allow_pickle=False का उपयोग करते हैं और यह अलग-अलग व्यवहार कैसे करता है?

+2

मुझे लगता है (इसलिए कोई जवाब नहीं लिख रहा है) कि NumPy गैर मानक वस्तुओं को सहेजने के लिए अचार मॉड्यूल का उपयोग करता है, इसलिए इसे अक्षम करके आप अपने डेटा को मानक डेटाटाइप पर काम करने के लिए सीमित कर देते हैं। – abukaj

+0

दिलचस्प लगता है और समझ में आता है। आपका मतलब है कि अगर मेरे पास कुछ वर्ग है जो मैं अपने उदाहरणों को NumPy सरणी में सहेजता हूं, तो अगर मैं 'अचार' के उपयोग को अक्षम करता हूं, तो यह मैट्रिक्स सामग्री को सहेजने में सक्षम नहीं होगा .. सही? – SalatYerakot

उत्तर

5

एक ऑब्जेक्ट सरणी केवल एक सामान्य numpy सरणी है जहां dtypeobject है; ऐसा तब होता है जब सरणी की सामग्री सामान्य संख्यात्मक प्रकारों की नहीं होती है (जैसे int या float, आदि)। हम ऑब्जेक्ट्स के साथ एक numpy सरणी को सहेजने का प्रयास कर सकते हैं, यह जांचने के लिए कि यह कैसे काम करता है।

>>> 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) 

लोड हो रहा है इस वापस ठीक काम करता है: वस्तु का एक सरल तरह एक dict होगा

>>> np.load('test.pkl.npy') 
array([{0: 1}, {1: 1}, {2: 1}, {3: 1}], dtype=object) 

सरणी, अचार का उपयोग कर यद्यपि बिना सहेजा नहीं जा सकता:

>>> np.save('test.pkl', a, allow_pickle=False) 
... 
ValueError: Object arrays cannot be saved when allow_pickle=False 

अचार के लिए अंगूठे का नियम यह है कि यदि आप एक अचार लोड कर रहे हैं तो आप सुरक्षित हैं, लेकिन आपको कहीं और से प्राप्त अचार लोड करने के बारे में सावधान रहना चाहिए। एक बात के लिए, यदि आपके पास समान पुस्तकालय (या लाइब्रेरी संस्करण) स्थापित नहीं हैं जो कि अचार बनाने के लिए उपयोग किए गए थे, तो हो सकता है कि आप अचार को लोड नहीं कर पाएंगे (यह पोर्टेबिलिटी उपरोक्त है)। सुरक्षा एक और संभावित चिंता है; उदाहरण के लिए, this article में अचारों का दुरुपयोग कैसे किया जा सकता है, इसके बारे में आप कुछ पढ़ सकते हैं।

+0

यह भी देखें दस्तावेज़ https://docs.scipy.org/doc/numpy/neps/npy-format.html – bluss