Comment convertir un tableau booléen en tableau int

129

J'utilise Scilab et je souhaite 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 multipliez-le par 1:

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

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

Kwolf
la source
Demandez-vous un moyen de convertir un tableau booléen en un nombre entier sans scipy, numpy et autres?
Sukrit Kalra
Il existe une manière distincte de formater le code. Vous n'êtes pas obligé d'utiliser blockquote. C'est fait par indentation, et le bouton accolades au-dessus de l'éditeur de questions le fera pour vous. Vérifiez-le.
Marcin
Sukrit, je m'en fiche si je dois utiliser scipy, numpy ou tout autre package de module python.
Kwolf

Réponses:

167

Les tableaux Numpy ont une astypeméthode. Fais juste y.astype(int).

Notez qu'il peut même ne pas être nécessaire de le faire, en fonction de l'utilisation que vous faites de la baie. Bool sera autopromoté en int dans de nombreux cas, vous pouvez donc l'ajouter aux tableaux int sans avoir à le convertir explicitement:

>>> x
array([ True, False,  True], dtype=bool)
>>> x + [1, 2, 3]
array([2, 2, 4])
BrenBarn
la source
5
oui, je peux aussi taper x * 1 ... et il fait la même chose que scilab .... * se sent idiot maintenant * .. merci à tous pour votre aide! .... même si la réponse était juste dans mon question, j'ai vraiment aimé obtenir la variété de réponses et voir toutes les différentes façons de le faire. Vraiment ouvert mon esprit concernant python.
Kwolf
Re les tableaux booléens faisant l'objet d'une promotion automatique: malheureusement, numpy n'est pas cohérent avec cela. Essayez de soustraire deux tableaux booléens, et vous obtenez une TypeError et un message d'obsolescence.
oulenz
52

La 1*yméthode 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 des listes Python de Boolean en int, vous pouvez utiliser mappour 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 compréhensions de liste:

>>> testList
[False, False, True, True]
>>> [int(elem) for elem in testList]
[0, 0, 1, 1]
Sukrit Kalra
la source
donc, y = 1 if x else 0 est le même y = 1 if x>0 else 0et le même que if x: y = 1 ""NEXT LINE"" else: y = 0.... comment avez-vous appris ces astuces, je ne l'ai pas vu dans la documentation de l' instruction if ?
Kwolf
Non, ce y=1 if x else 0n'est pas le même que y=1 if x>0 else 0, puisque ce dernier ne prend pas en compte les nombres négatifs. C'est exactement ce que Python définit comme Trueou False, tout cela se trouve dans la documentation.
Sukrit Kalra
24

En utilisant numpy, vous pouvez faire:

y = x.astype(int)

Si vous utilisiez un tableau non numpy, vous pouvez utiliser une compréhension de liste :

y = [int(val) for val in x]
cjm
la source
14

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 procéder est:

yourArray.astype(int)

ou

yourArray.astype(float)
Gioelelm
la source
3

Je sais que vous avez demandé des solutions sans boucle, mais les seules solutions que je peux proposer sont probablement 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
bsoist
la source
oui, le bouclage est lent. d'après ce que j'ai lu, si vous avez besoin de faire un peu de temps critique, vous devriez appeler c depuis python. Connaissez-vous des références pour faire cela? aussi, merci pour votre aide. surpris de la rapidité avec laquelle tout le monde a répondu!
Kwolf
2

Une façon amusante de le faire est

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Thomas G.
la source