Come convertire un array booleano in un array int


129

Uso Scilab e voglio convertire un array di booleani in un array di numeri interi:

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

In Scilab posso usare:

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

o anche solo moltiplicarlo per 1:

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

C'è un semplice comando per questo in Python o dovrei usare un ciclo?


Stai chiedendo un modo per convertire un array booleano in uno intero senza scipy, numpy e simili?
Sukrit Kalra

C'è un modo separato per formattare il codice. Non devi usare blockquote. È fatto indentando e il pulsante parentesi graffe sopra l'editor delle domande lo farà per te. Controlla.
Marcin

Sukrit, non mi interessa se devo usare scipy, numpy o qualsiasi altro pacchetto di moduli python.
Kwolf

Risposte:


167

Gli array Numpy hanno un astypemetodo. Fallo e basta y.astype(int).

Nota che potrebbe non essere nemmeno necessario farlo, a seconda di cosa stai usando l'array. Bool verrà autopromosso in molti casi, quindi puoi aggiungerlo agli array int senza doverlo convertire esplicitamente:

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

5
sì, posso anche digitare x * 1 ... e fa la stessa cosa di scilab .... * sembra uno stupido ora * .. grazie a tutti per il vostro aiuto! .... anche se la risposta era giusta nel mio domanda, mi è piaciuto molto ottenere la varietà di risposte e vedere tutti i diversi modi per farlo. Mi ha davvero aperto la mente riguardo a Python.
Kwolf

Re gli array booleani vengono autopromossi: sfortunatamente, numpy non è coerente con questo. Prova a sottrarre due array booleani e otterrai un TypeError e un messaggio di deprecazione.
oulenz

52

Il 1*ymetodo funziona anche in 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]) 

Se stai chiedendo un modo per convertire gli elenchi Python da Boolean a int, puoi usare mapper farlo:

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

O usando le liste di comprensione:

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

quindi, y = 1 if x else 0 è lo stesso y = 1 if x>0 else 0e lo stesso di if x: y = 1 ""NEXT LINE"" else: y = 0.... come hai imparato quei trucchi, non l'ho visto nella documentazione dell'istruzione if ?
Kwolf

No. y=1 if x else 0non è uguale a y=1 if x>0 else 0, poiché quest'ultimo non tiene conto dei numeri negativi. Questo è proprio ciò che Python definisce Trueo False, sono tutti nella documentazione.
Sukrit Kalra

24

Usando numpy, puoi fare:

y = x.astype(int)

Se stavi usando un array non numpy, potresti usare una comprensione dell'elenco :

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

14

La maggior parte delle volte non è necessaria la conversione:

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

Il modo giusto per farlo è:

yourArray.astype(int)

o

yourArray.astype(float)

3

So che hai chiesto soluzioni senza loop, ma le uniche soluzioni che posso trovare probabilmente loop internamente comunque:

map(int,y)

o:

[i*1 for i in y]

o:

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

sì, il looping è lento. da quello che ho letto, se hai bisogno di fare un po 'di crunch critico dovresti chiamare c da python. Conosci qualche riferimento per farlo? inoltre, grazie per il tuo aiuto. sorpreso di quanto velocemente tutti abbiano risposto!
Kwolf

2

Un modo divertente per farlo è

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.