python

2013-06-01 11 views
9

में बूलियन सरणी से int सरणी में कनवर्ट करने के लिए कैसे करें मेरे पास एक नम्पी 2-डी सरणी है जिसमें एक कॉलम में बूलियन मान i.e. True/False है। मैं इसे क्रमशः 1 और 0 में परिवर्तित करना चाहता हूं, मैं इसे कैसे कर सकता हूं?python

उदा। मेरी data[0::,2] बूलियन है, मैं

data[0::,2]=int(data[0::,2]) 

कोशिश की, लेकिन यह मुझे त्रुटि दे रहा है:

TypeError: only length-1 arrays can be converted to Python scalars

मेरी पहली 5 सरणी की पंक्तियों हैं:

[['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
['0', '3', 'True', '35', '0', '0', '8.05', '0']] 
+2

यह एक 2 डी सरणी नहीं किया जा सकता है, क्योंकि 2 डी सरणी में सभी तत्वों को एक ही प्रकार की है। शायद, आपके पास एक संरचित सरणी है। क्या आप, कृपया, उससे कुछ पूर्ण पंक्तियां दिखाएं और इसके 'प्रकार' को दिखाएं? – kirelagin

+1

ठीक है, उन उद्धरणों को आपको संकेत देना चाहिए कि आपके पास तारों की एक सरणी है। तो, फिर, numpy में 2 डी-सरणी के सभी तत्वों का एक ही प्रकार होना चाहिए। आपको या तो [संरचित सरणी] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) की आवश्यकता है या बस numpy से छुटकारा पाएं और सामान्य पायथन सूचियों का उपयोग करें। आपको numpy की आवश्यकता क्यों है और आपका अंतिम लक्ष्य क्या है? – kirelagin

+1

असल में मैं मशीन लर्निंग प्रोजेक्ट पर एक ट्यूटोरियल का अनुसरण कर रहा हूं जो पाइथन का उपयोग करता है, और जैसा कि मैं पाइथन के लिए नया हूं, मुझे इन कठिनाई का सामना करना पड़ रहा है, यह numpy सरणी के लिए पूछता है। तो यह बहुत अच्छा होगा अगर आप मुझे बता सकते हैं कि स्ट्रिंग्स के इस पूरे सरणी को कैसे फ़्लोट करना है क्योंकि यह स्पष्ट है कि इसे फ्लोट में परिवर्तित किया जा सकता है (1 के रूप में सही इलाज और 0 के रूप में फेज का इलाज)। –

उत्तर

9

ठीक है, सबसे आसान फ्लोट करने के लिए किसी भी सरणी को बदलने का तरीका यह है:

data.astype(float)

आपकी सरणी के साथ समस्या यह है कि float('True') एक त्रुटि है, क्योंकि 'True' को फ्लोट नंबर के रूप में पार्स नहीं किया जा सकता है। तो, सबसे अच्छी बात यह है कि बूल के बजाए फ्लोट (या, कम से कम, वैध फ्लोट अक्षर के साथ तार) का उत्पादन करने के लिए अपने सरणी पीढ़ी कोड को ठीक करना है।

इस बीच आप इस सुविधा का उपयोग कर सकते हैं अपने सरणी ठीक करने के लिए:

def boolstr_to_floatstr(v): 
    if v == 'True': 
     return '1' 
    elif v == 'False': 
     return '0' 
    else: 
     return v 

और अंत में आप इस तरह अपने सरणी परिवर्तित:

new_data = np.vectorize(boolstr_to_floatstr)(data).astype(float) 
+0

यह त्रुटि दे रही है: "में परिवर्तित नहीं कर सकता है फ्लोट करने के लिए स्ट्रिंग:" –

+0

@AkashdeepSaluja मैं दोबारा जांच कर कोड है और यह मेरे लिए काम कर रहा है। क्या आप अपने प्रश्न को 'डेटा [: 5] 'के सटीक आउटपुट के साथ अपडेट कर सकते हैं। – kirelagin

+0

प्रश्न में आउटपुट सटीक आउटपुट है, क्या आप कुछ और चाहते हैं? –

1

मैं अपने कच्चे डेटा स्रोत पर ऐसा करते हैं, जो तार है:

data = [['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
     ['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
     ['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
     ['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
     ['0', '3', 'True', '35', '0', '0', '8.05', '0']] 

data = [[eval(x) for x in y] for y in data] 

..और तो पालन उस के साथ:

data = [[float(x) for x in y] for y in data] 
# or this if you prefer: 
arr = numpy.array(data) 

.. फिर समस्या हल हो जाती है। ..तुम इसे एक लाइनर के रूप में भी कर सकते हैं (मुझे लगता है कि यह इंक बनाता है, हालांकि, और फ्लोट की शायद आवश्यकता होती है): numpy.array ([[eval (x) x में y के लिए y] डेटा में वाई के लिए])

.. मुझे लगता है कि समस्या यह है कि numpy आपके संख्यात्मक स्ट्रिंग को तारों के रूप में रख रहा है, और चूंकि आपके सभी तार संख्यात्मक नहीं हैं, इसलिए आप पूरे सरणी पर एक प्रकार का रूपांतरण नहीं कर सकते हैं। साथ ही, यदि आप "ट्रू" और "गलत" के साथ सरणी के हिस्सों पर एक प्रकार का रूपांतरण करने का प्रयास करते हैं, तो आप वास्तव में बूलियन के साथ काम नहीं कर रहे हैं, लेकिन तारों के साथ। ..और मुझे बदलने का एकमात्र तरीका eval स्टेटमेंट करना है। ..well, तो आप इस, भी कर सकता है:

..this जिस तरह से आप evals है, जो स्वाभाविक असुरक्षित हैं से बचें। .. लेकिन इससे कोई फर्क नहीं पड़ता, क्योंकि आप एक विश्वसनीय डेटा स्रोत का उपयोग कर रहे हैं।

1

साथ ast.literal_eval

>>> import ast 
>>> import numpy as np 
>>> arr = np.array(
     [['0', '3', 'True', '22', '1', '0', '7.25', '0'], 
     ['1', '1', 'False', '38', '1', '0', '71.2833', '1'], 
     ['1', '3', 'False', '26', '0', '0', '7.925', '0'], 
     ['1', '1', 'False', '35', '1', '0', '53.1', '0'], 
     ['0', '3', 'True', '35', '0', '0', '8.05', '0']]) 
>>> np.vectorize(ast.literal_eval, otypes=[np.float])(arr) 
array([[ 0. , 3. , 1. , 22. , 1. , 0. , 
      7.25 , 0. ], 
     [ 1. , 1. , 0. , 38. , 1. , 0. , 
     71.2833, 1. ], 
     [ 1. , 3. , 0. , 26. , 0. , 0. , 
      7.925 , 0. ], 
     [ 1. , 1. , 0. , 35. , 1. , 0. , 
     53.1 , 0. ], 
     [ 0. , 3. , 1. , 35. , 0. , 0. , 
      8.05 , 0. ]]) 
3

boolarrayvariable @ kirelagin के विचार का उपयोग करना।astype (int) काम करता है:

data = np.random.normal(0,1,(1,5)) 
threshold = 0 
test1 = (data>threshold) 
test2 = test1.astype(int) 

आउटपुट:

data = array([[ 1.766, -1.765, 2.576, -1.469, 1.69]]) 
test1 = array([[ True, False, True, False, True]], dtype=bool) 
test2 = array([[1, 0, 1, 0, 1]]) 
0

पुरानी क्यू लेकिन, संदर्भ के लिए - एक bool एक नाव के लिए एक पूर्णांक और एक पूर्णांक में बदला जा सकता

डेटा [0 ::, 2] = डेटा [0 ::, 2] .astype (int) .astype (नाव)

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