2013-06-01 4 views
9

J'ai un tableau Numpy 2-D dans lequel une colonne a des valeurs booléennes, c'est-à-dire True/False. Je veux le convertir en entier 1 et 0 respectivement, comment puis-je le faire?Comment convertir un tableau booléen en tableau int en python

E.g. mon data[0::,2] est booléen, j'ai essayé

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

, mais il me donne l'erreur:

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

Mes 5 premières lignes de la matrice sont:

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

Ceci ne peut pas être un tableau 2D, car dans un tableau 2D, tous les éléments ont le même type. Probablement, vous avez un tableau structuré. Pourriez-vous, s'il vous plaît, en montrer quelques lignes complètes et son 'dtype'? – kirelagin

+1

OK, ces citations devraient vous indiquer que vous avez un tableau de chaînes. Donc, encore une fois, en numpy, tous les éléments d'un tableau 2D doivent avoir le même type. Vous avez besoin de [tableaux structurés] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) ou simplement vous débarrasser de numpy et utiliser des listes Python ordinaires. Pourquoi avez-vous besoin de numpy et quel est votre objectif final? – kirelagin

+1

En fait, je suis un tutoriel sur le projet d'apprentissage machine qui utilise python, et comme je suis nouveau sur python je suis confronté à ces difficultés, il demande un tableau numpy. Donc ce serait génial si vous pouviez me dire comment convertir tout ce tableau de chaînes pour flotter car il est clair qu'il peut être converti en float (traiter true comme 1 et fase comme 0). –

Répondre

9

Ok, le plus façon de changer un type de tout tableau à faire est float:

data.astype(float)

Le problème avec votre tableau est que float('True') est une erreur, car 'True' ne peut pas être analysé comme un nombre flottant. Donc, la meilleure chose à faire est de réparer votre code de génération de tableau pour produire des flottants (ou, au moins, des chaînes avec des littéraux float valides) au lieu de booléens.

En attendant, vous pouvez utiliser cette fonction pour fixer votre tableau:

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

Et enfin, vous convertir votre tableau comme ceci:

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

Il donne l'erreur: "n'a pas pu convertir la chaîne en float:" –

+0

@AkashdeepSaluja J'ai vérifié le code et cela fonctionne pour moi. Pourriez-vous s'il vous plaît mettre à jour votre question avec la sortie exacte de 'data [: 5]'. – kirelagin

+0

La sortie dans la question est la sortie exacte, voulez-vous quelque chose d'autre? –

1

Si je fais cela sur votre source de données brutes, qui est des chaînes:

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] 

..et puis suivre cela avec:

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

..puis le problème est résolu. ..vous pouvez même le faire comme un seul ligne (je pense que cela fait ints, cependant, et les flotteurs sont probablement nécessaires): numpy.array ([[eval (x) pour x dans y] pour y dans les données])

..Je pense que le problème est que numpy garde vos chaînes numériques sous forme de chaînes, et puisque toutes vos chaînes ne sont pas numériques, vous ne pouvez pas faire une conversion de type sur l'ensemble du tableau. Aussi, si vous essayez de faire une conversion de type juste sur les parties du tableau avec "True" et "False", vous ne travaillez pas vraiment avec des booléens, mais avec des chaînes. ..et les seules façons que je connais de changer sont de faire la déclaration eval. ..well, vous pouvez le faire aussi:

façon

..ce vous éviter evals, qui sont par nature précaire. ..mais cela n'a pas d'importance, puisque vous utilisez peut-être une source de données fiable.

1

En utilisant l'idée de @ kirelagin avec 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) fonctionne:

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

sortie:

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

Old Q mais, pour référence - un bool peut être converti en un int et un int à un flotteur

données [0 ::, 2] = data [0 ::, 2] .astype (int) .astype (float)

Questions connexes