2017-06-09 5 views
6

नम्पी के पास कई अलग-अलग मूल प्रकार हैं, जिनमें से सभी listed here हैं।कुछ numpy डेटाैट्स JSON serializable क्यों हैं और दूसरों को नहीं?

मैं float32 करने के लिए अपने कार्यक्रम में एक मुद्दा नीचे ट्रैक करने के बाद नहीं रहा है JSON-serializable किया जा रहा है, तो मैं उपरोक्त सूची में से सभी डेटाटाइप्स परीक्षण शुरू कर दिया है:

>>> import numpy as np 
>>> from json import dumps 
>>> dumps(np.bool(True)) 
'true' 
>>> dumps(np.bool_(True)) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/lib/python3.4/json/__init__.py", line 230, in dumps 
    return _default_encoder.encode(obj) 
    File "/usr/lib/python3.4/json/encoder.py", line 192, in encode 
    chunks = self.iterencode(o, _one_shot=True) 
    File "/usr/lib/python3.4/json/encoder.py", line 250, in iterencode 
    return _iterencode(o, 0) 
    File "/usr/lib/python3.4/json/encoder.py", line 173, in default 
    raise TypeError(repr(o) + " is not JSON serializable") 
TypeError: True is not JSON serializable 
>>> dumps(np.int(0)) 
'0' 
>>> dumps(np.int_(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.intc(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.intp(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.int8(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.int16(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.int32(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.int64(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.uint8(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.uint16(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.uint32(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.uint64(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0 is not JSON serializable 
>>> dumps(np.float(0)) 
'0.0' 
>>> dumps(np.float_(0)) 
'0.0' 
>>> dumps(np.float16(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0.0 is not JSON serializable 
>>> dumps(np.float32(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0.0 is not JSON serializable 
>>> dumps(np.float64(0)) 
'0.0' 
>>> dumps(np.complex(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0j is not JSON serializable 
>>> dumps(np.complex_(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0j is not JSON serializable 
>>> dumps(np.complex64(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0j is not JSON serializable 
>>> dumps(np.complex128(0)) 
Traceback (most recent call last): 
    [...] 
TypeError: 0j is not JSON serializable 

तो, कोई complex प्रकार serializable है , यह समझ आता है।

लेकिन bool काम करता है और bool_ नहीं करता है। int काम करता है, लेकिन इसके नाम पर int के साथ कुछ भी नहीं है। float, float_ और float64 सभी ठीक हैं, लेकिन float16 और float32 नहीं हैं।

ऐसा क्यों है? जाहिर है, वे सभी आसानी से एक स्ट्रिंग में परिवर्तित हो सकते हैं, स्टैकट्रैक भी repr() दिखाता है जो उनके मूल्य को प्रदर्शित करने के लिए उपयोग किया जा रहा है। क्या यह अनजान हो सकता है? या इस व्यवहार के लिए कोई अच्छा कारण है?

+0

क्या आप सीधे 'np.float32 (...)' ऑब्जेक्ट बना रहे हैं? या यह एक सरणी से निकाला गया है? 'Arr.tolist()' समकक्ष क्रमबद्ध करने का प्रयास किया है? – hpaulj

+0

यदि आपको किसी सरणी के तत्व को क्रमबद्ध करने की आवश्यकता है, तो इसे एक पायथन स्केलर में बदलने के लिए '.item()' विधि का उपयोग करने पर विचार करें। – hpaulj

+0

यह भी देखें https://stackoverflow.com/questions/27050108/convert-numpy-type-to-python 'numpy टाइप को पायथन' – hpaulj

उत्तर

4

डेटा प्रकार है कि JSON serializable हैं सभी अजगर बनाया-इन कर रहे हैं:

>>> np.int is int 
True 
>>> np.float is float 
True 
>>> np.bool is bool 
True 

तो सब NumPy डेटा प्रकार है कि आप को दिखाने JSON serializable नहीं हैं। कम से कम संगत है।

np.float _ (MacOS पर परीक्षण) np.float64 रूप में ही है:

>>> np.float_ is np.float64 
True 

मदद का कहना है:

np.float64

64-बिट फ्लोटिंग प्वाइंट नंबर। चरित्र कोड 'डी'। पायथन फ्लोट संगत।

जबकि:

np.float32

32-बिट फ्लोटिंग प्वाइंट नंबर। चरित्र कोड 'एफ'। सी फ्लोट संगत।

तो, पाइथन फ्लोट संगत प्रकार json.dumps() के साथ काम करते हैं, लेकिन सी संगत लोग नहीं करते हैं।

+0

में कनवर्ट करें फिर 'float64' और' float_' क्यों काम करते हैं? '>>> np.float64 फ्लोट है 'और' >>> np.float_ फ्लोट है' दोनों 'झूठी' वापसी। – iFreilicht

+0

मेरा अद्यतन उत्तर देखें। –

+1

आप '__mro__' भी देख सकते हैं। 'np.float64 .__ mro__' में' float', np.float32 .__ mro__' शामिल नहीं है। – hpaulj

संबंधित मुद्दे