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?


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

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]

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]

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)

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

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])
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.