मुझे इस प्रश्न का उत्तर थोड़ा अलग कारण के लिए जरूरी था: जांच कर रहा हूं कि जब मैं डेटा खोने के बिना फ़्लोटिंग पॉइंट नंबरों की पूरी सरणी को पूर्णांक में परिवर्तित कर सकता हूं।
Hunse के जवाब लगभग मेरे लिए काम करता है, सिवाय इसके कि मैं स्पष्ट रूप से यथा-स्थान चाल का उपयोग नहीं कर सकते हैं, के बाद से मैं आपरेशन पूर्ववत करने के लिए सक्षम होना चाहिए:
if np.all(np.mod(x, 1) == 0):
x = x.astype(int)
वहाँ से, मैं के बारे में सोचा निम्नलिखित विकल्प जो शायद कई स्थितियों में तेजी से होता है:
x_int = x.astype(int)
if np.all((x - x_int) == 0):
x = x_int
कारण यह है कि सापेक्ष आपरेशन घटाव की तुलना में धीमी है। हालांकि, अब हम सामने के पूर्णांक के लिए कास्टिंग करते हैं - मुझे नहीं पता कि ऑपरेशन कितनी तेजी से है, अपेक्षाकृत बोल रहा है। लेकिन अगर आपके एरे के अधिकांश पूर्णांक हैं (वे मेरे मामले में हैं), बाद वाला संस्करण लगभग निश्चित रूप से तेज़ है।
एक और लाभ यह है कि आप कुछ सहिष्णुता के भीतर जांचने के लिए np.isclose
जैसे उपखंड को प्रतिस्थापित कर सकते हैं (बेशक आपको सावधान रहना चाहिए, क्योंकि छिड़काव उचित गोल नहीं है!)।
x_int = x.astype(int)
if np.all(np.isclose(x, x_int, 0.0001)):
x = x_int
संपादित करें: धीमी, लेकिन शायद यह आपके यूज-केस के आधार पर मूल्य, भी पूर्णांकों को व्यक्तिगत रूप से उपस्थित अगर परिवर्तित।
x_int = x.astype(int)
safe_conversion = (x - x_int) == 0
# if we can convert the whole array to integers, do that
if np.all(safe_conversion):
x = x_int.tolist()
else:
x = x.tolist()
# if there are _some_ integers, convert them
if np.any(safe_conversion):
for i in range(len(x)):
if safe_conversion[i]:
x[i] = int(x[i])
जहां इस मायने रखती का एक उदाहरण के रूप में: यह मेरे लिए बाहर काम करता है, क्योंकि मैं विरल डेटा (जो ज्यादातर शून्य का मतलब है), जो मैं तो JSON में बदलने का है, एक बार, और बाद में एक सर्वर पर पुन: उपयोग। फ्लोट्स के लिए, ujson
उन्हें [ ...,0.0,0.0,0.0,... ]
के रूप में परिवर्तित करता है, और इनट्स के लिए [...,0,0,0,...]
में परिणाम होता है, जो स्ट्रिंग में वर्णों की आधा संख्याओं को बचाता है। यह दोनों सर्वर (छोटे तार) और क्लाइंट (छोटे तारों, संभवतः थोड़ा तेज़ JSON पार्सिंग) पर ओवरहेड को कम करता है।
मजेदार आपको इसका जिक्र करना चाहिए। मैं पूछ रहा था क्योंकि मैं बस ऐसा करने के बारे में सोच रहा हूं। –
संपादित करें: नहीं यह नहीं होगा -> bitwise_and तेजी से नहीं होगा? संपादित करें: ओह, ठीक है, वे स्वाभाविक रूप से केवल पूर्णांक पर लागू होते हैं, फ्लोट नहीं! हाल ही में जेएस पूर्णांक coercian कर थोड़ा सा समय बिताया ... – Job