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?
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])
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]
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]
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)
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