2013-06-01 11 views
9

Ho un array Numpy 2-D in cui una colonna ha valori booleani, ad esempio True/False. Voglio convertirlo in numero intero 1 e 0 rispettivamente, come posso farlo?Come convertire da un array booleano a un array int in python

E.g. il mio data[0::,2] è booleano, ho provato

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

, ma mi sta dando errore:

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

mie prime 5 file di serie sono:

[['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

Questo non può essere un array 2D, poiché nella matrice 2D tutti gli elementi hanno lo stesso tipo. Probabilmente hai una matrice strutturata. Potresti, per favore, mostrare qualche riga completa da essa e il suo 'dtype'? – kirelagin

+1

OK, quelle citazioni dovrebbero suggerirti che hai una serie di stringhe. Quindi, ancora una volta, in numpy tutti gli elementi di un array 2D devono avere lo stesso tipo. O hai bisogno di [array strutturati] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) o semplicemente di liberarti di Numpy e di usare liste ordinarie di Python. Perché hai bisogno di numpy e qual è il tuo obiettivo finale? – kirelagin

+1

Attualmente sto seguendo un tutorial sul progetto di machine learning che usa python, e siccome sono nuovo in Python sono di fronte a questa difficoltà, richiede array numpy. Quindi sarebbe fantastico se tu potessi dirmi come convertire l'intera serie di stringhe in modo che fluttuino, poiché è chiaro che può essere convertito in float (il trattamento vero come 1 e fase come 0). –

risposta

9

Ok, il più facile modo per cambiare un tipo di qualsiasi array per fare float:

data.astype(float)

Il problema con l'array è che float('True') è un errore, perché 'True' non può essere analizzato come numero float. Quindi, la cosa migliore da fare è correggere il codice di generazione dell'array per produrre float (o, almeno, stringhe con valori letterali validi validi) anziché bool.

Nel frattempo è possibile utilizzare questa funzione per risolvere il tuo array:

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

E, infine, si convertire l'array in questo modo:

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

Si sta dando errore: "Impossibile convertire la stringa in float:" –

+0

@AkashdeepSaluja Ho ricontrollato il codice e funziona per me. Potresti aggiornare la tua domanda con l'esatto risultato di 'data [: 5]'. – kirelagin

+0

L'output nella domanda è l'output esatto, vuoi qualcos'altro? –

1

Se faccio questo sulla vostra fonte di dati grezzi, che è stringhe:

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] 

..e poi seguire che con:

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

..questo problema è risolto. ..puoi anche farlo come one-liner (penso che questo faccia sì che siano necessari anche i float): numpy.array ([[eval (x) per x in y] per y nei dati])

..Penso che il problema è che numpy mantiene le stringhe numeriche come stringhe e dal momento che non tutte le stringhe sono numeriche, non è possibile eseguire una conversione di tipo sull'intero array. Inoltre, se provi a eseguire una conversione di tipo solo sulle parti dell'array con "True" e "False", non stai veramente lavorando con i booleani, ma con le stringhe. ..e gli unici modi in cui so di cambiare sono quelli di fare la dichiarazione di valutazione. ..ben, si potrebbe fare anche questo:

..questo modo si evita evals, che sono intrinsecamente insicuro. ... ma potrebbe non essere importante, dal momento che potresti utilizzare un'origine dati attendibile.

1

Utilizzando idea di @ kirelagin con 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.astype (int) funziona:

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

uscita:

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

Vecchio Q, ma, per riferimento - un bool può essere convertito in un int e un int in un float

dati [0 ::, 2] = dati [0 ::, 2] .astype (int) .astype (float)

Problemi correlati