2 डी फ्लोट नंबरी सरणी को 2D इंट सुपीरियर एरे में कैसे बदलें?


301

वास्तविक खसरा सरणी को अंको सरणी में कैसे बदलें? सीधे सरणी में मैप का उपयोग करने की कोशिश की लेकिन यह काम नहीं किया।

जवाबों:


404

astypeविधि का प्रयोग करें ।

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> x.astype(int)
array([[1, 2],
       [1, 2]])

30
बस सुनिश्चित करें कि आपके पास np.infया np.nanआपके सरणी में नहीं है , क्योंकि उनके पास आश्चर्यजनक परिणाम हैं। उदाहरण के लिए, np.array([np.inf]).astype(int)आउटपुट array([-9223372036854775808])
गैरेट

मेरी मशीन पर, np.array([np.inf]).astype(int), np.array([-np.inf]).astype(int), और np.array([np.nan]).astype(int)सभी एक ही बात लौटने। क्यों?
बॉलपॉइंटबैन

1
@ बॉलपॉइंटबैन: nanऔर infफ्लोटिंग-पॉइंट वैल्यू हैं और इसे सार्थक रूप से इंट में परिवर्तित नहीं किया जा सकता है। जैसा कि आपके नोट्स से पहले टिप्पणी है, आश्चर्यजनक व्यवहार होगा, और मुझे नहीं लगता कि सटीक व्यवहार अच्छी तरह से परिभाषित है। यदि आप मानचित्र बनाना चाहते हैं nanऔर infकुछ मूल्यों के लिए, तो आपको स्वयं ऐसा करने की आवश्यकता है।
ब्रेनबार

ध्यान दें कि x.astype (int) [0] [0] प्रकार का नहीं है int। यह है numpy.int32
क्रिस एंडरसन

ध्यान दें कि हालांकि यह सरणी को ints में परिवर्तित करता है, @ fhtuft का उत्तर जिसके परिणामस्वरूप कम आश्चर्य हो सकता है
नाथन मूसोक

66

: कैसे गोलाई को नियंत्रित करने के लिए कुछ numpy कार्यों प्रिंट करें , फर्श , TRUNC , प्लस्तर लगाना । निर्भर करता है कि आप कैसे फ़्लोट को गोल करना चाहते हैं, ऊपर, नीचे, या निकटतम इंट को।

>>> x = np.array([[1.0,2.3],[1.3,2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> y = np.trunc(x)
>>> y
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> z = np.ceil(x)
>>> z
array([[ 1.,  3.],
       [ 2.,  3.]])
>>> t = np.floor(x)
>>> t
array([[ 1.,  2.],
       [ 1.,  2.]])
>>> a = np.rint(x)
>>> a
array([[ 1.,  2.],
       [ 1.,  3.]])

इंट में या अन्य प्रकारों में से किसी एक को सुस्पष्ट करने के लिए, astype (जैसा कि ब्रेनबर्न द्वारा उत्तर दिया गया है):

a.astype(int)
array([[1, 2],
       [1, 3]])

>>> y.astype(int)
array([[1, 2],
       [1, 2]])

2
ठीक वही जो मेरे द्वारा खोजा जा रहा था। astypeअक्सर बहुत सामान्य है, और मुझे लगता है कि यह संभव है जब intx - inty रूपांतरण कर रही है। जब मैं फ्लोट करना चाहता हूं - इस तरह की गोलाई चुनने में सक्षम होने के लिए अंतर रूपांतरण एक अच्छी सुविधा है।
बकुरीउ

11
सुरक्षित रूप से की तरह लगभग-ints कन्वर्ट करने के लिए सबसे आसान तरीका है तो 7.99999ints चाहते 8, है np.rint(arr).astype(int)?
एंडोलिथ

किसी भी तरह से यह uint8 बनाने के लिए numpy में?
रयान

2
@ रेयानastype(np.uint8)
क्रिस एंडरसन

14

आप उपयोग कर सकते हैं np.int_:

>>> x = np.array([[1.0, 2.3], [1.3, 2.9]])
>>> x
array([[ 1. ,  2.3],
       [ 1.3,  2.9]])
>>> np.int_(x)
array([[1, 2],
       [1, 2]])

12

आप नहीं कर रहे हैं सुनिश्चित करें कि आपके इनपुट एक Numpy सरणी होने जा रहा है, तो आप उपयोग कर सकते हैं asarrayके साथ dtype=intके बजाय astype:

>>> np.asarray([1,2,3,4], dtype=int)
array([1, 2, 3, 4])

यदि इनपुट सरणी में पहले से ही सही dtype है, asarrayतो सरणी कॉपी से बचता है जबकि astypeऐसा नहीं होता (जब तक आप निर्दिष्ट नहीं करते copy=False)

>>> a = np.array([1,2,3,4])
>>> a is np.asarray(a)  # no copy :)
True
>>> a is a.astype(int)  # copy :(
False
>>> a is a.astype(int, copy=False)  # no copy :)
True
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.