web-dev-qa-db-fra.com

Comment convertir un tableau booléen en tableau int

J'utilise Scilab et je veux convertir un tableau de booléens en un tableau d'entiers:

>>> x = np.array([4, 3, 2, 1])
>>> y = 2 >= x
>>> y
array([False, False,  True,  True], dtype=bool)

Dans Scilab, je peux utiliser:

>>> bool2s(y)
0.    0.    1.    1.  

ou même simplement le multiplier par 1:

>>> 1*y
0.    0.    1.    1.  

Existe-t-il une commande simple pour cela en Python, ou devrais-je utiliser une boucle?

100
Kwolf

Les tableaux Numpy ont une méthode astype. Il suffit de faire y.astype(int).

Notez que cela peut même ne pas être nécessaire, en fonction de l'utilisation du tableau. Dans de nombreux cas, Bool sera automatiquement propoté à int, vous pouvez donc l'ajouter à des tableaux int sans avoir à le convertir explicitement:

>>> x
array([ True, False,  True], dtype=bool)
>>> x + [1, 2, 3]
array([2, 2, 4])
136
BrenBarn

La méthode 1*y fonctionne également dans Numpy:

>>> import numpy as np
>>> x = np.array([4, 3, 2, 1])
>>> y = 2 >= x
>>> y
array([False, False,  True,  True], dtype=bool)
>>> 1*y                      # Method 1
array([0, 0, 1, 1])
>>> y.astype(int)            # Method 2
array([0, 0, 1, 1]) 

Si vous demandez un moyen de convertir les listes Python du booléen au entier, vous pouvez utiliser map pour le faire:

>>> testList = [False, False,  True,  True]
>>> map(lambda x: 1 if x else 0, testList)
[0, 0, 1, 1]
>>> map(int, testList)
[0, 0, 1, 1]

Ou en utilisant des listes de compréhension:

>>> testList
[False, False, True, True]
>>> [int(elem) for elem in testList]
[0, 0, 1, 1]
41
Sukrit Kalra

En utilisant numpy, vous pouvez faire:

y = x.astype(int)

Si vous utilisiez un tableau non-numpy, vous pourriez utiliser un compréhension de la liste :

y = [int(val) for val in x]
18
cjm

La plupart du temps, vous n'avez pas besoin de conversion:

>>>array([True,True,False,False]) + array([1,2,3,4])
array([2, 3, 3, 4])

La bonne façon de le faire est:

yourArray.astype(int)

ou

yourArray.astype(float)
11
Gioelelm

Je sais que vous avez demandé des solutions sans boucle, mais les seules solutions que je puisse proposer sont probablement une boucle en interne de toute façon:

map(int,y)

ou:

[i*1 for i in y]

ou:

import numpy
y=numpy.array(y)
y*1
3
bsoist