So konvertieren Sie ein boolesches Array in ein int-Array

129

Ich verwende Scilab und möchte ein Array von Booleschen Werten in ein Array von Ganzzahlen konvertieren:

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

In Scilab kann ich verwenden:

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

oder multiplizieren Sie es einfach mit 1:

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

Gibt es dafür in Python einen einfachen Befehl oder müsste ich eine Schleife verwenden?

Kwolf
quelle
Fragen Sie nach einer Möglichkeit, ein boolesches Array in ein ganzzahliges Array ohne scipy, numpy und dergleichen umzuwandeln?
Sukrit Kalra
Es gibt eine separate Möglichkeit, Code zu formatieren. Sie müssen blockquote nicht verwenden. Dies geschieht durch Einrücken, und die Schaltfläche für geschweifte Klammern über dem Frageneditor erledigt dies für Sie. Hör zu.
Marcin
Sukrit, es ist mir egal, ob ich scipy, numpy oder ein anderes Python-Modulpaket verwenden muss.
Kwolf

Antworten:

166

Numpy Arrays haben eine astypeMethode. Tu es einfach y.astype(int).

Beachten Sie, dass dies möglicherweise nicht einmal erforderlich ist, je nachdem, wofür Sie das Array verwenden. Bool wird in vielen Fällen automatisch in int verschoben, sodass Sie es zu int-Arrays hinzufügen können, ohne es explizit konvertieren zu müssen:

>>> x
array([ True, False,  True], dtype=bool)
>>> x + [1, 2, 3]
array([2, 2, 4])
BrenBarn
quelle
5
Ja, ich kann auch x * 1 eingeben ... und es macht das Gleiche wie Scilab ... * fühlt sich jetzt wie Dummkopf an * .. Danke an alle für Ihre Hilfe! .... obwohl die Antwort in meiner richtig war Frage, ich mochte es wirklich, die Vielfalt der Antworten zu bekommen und all die verschiedenen Möglichkeiten zu sehen, es zu tun. Ich habe mich wirklich für Python geöffnet.
Kwolf
Zu booleschen Arrays, die automatisch weitergeleitet werden: Numpy stimmt leider nicht damit überein. Wenn Sie versuchen, zwei boolesche Arrays zu subtrahieren, erhalten Sie einen TypeError und eine Verfallsmeldung.
Oulenz
52

Die 1*yMethode funktioniert auch 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]) 

Wenn Sie nach einer Möglichkeit fragen, Python-Listen von Boolean in int zu konvertieren, können Sie Folgendes maptun:

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

Oder Listenverständnisse verwenden:

>>> testList
[False, False, True, True]
>>> [int(elem) for elem in testList]
[0, 0, 1, 1]
Sukrit Kalra
quelle
Also, y = 1 if x else 0 ist das gleiche wie y = 1 if x>0 else 0und das gleiche wie if x: y = 1 ""NEXT LINE"" else: y = 0... wie hast du diese Tricks gelernt, ich habe es nicht in der Dokumentation der if-Anweisung gesehen ?
Kwolf
Nein y=1 if x else 0ist nicht dasselbe wie y=1 if x>0 else 0, da letztere die negativen Zahlen nicht berücksichtigt. Dies ist genau das, was Python als Trueoder definiert False. Diese sind alle in der Dokumentation enthalten.
Sukrit Kalra
24

Mit numpy können Sie Folgendes tun:

y = x.astype(int)

Wenn Sie ein Array ohne Numpy verwenden, können Sie ein Listenverständnis verwenden :

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

Meistens benötigen Sie keine Konvertierung:

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

Der richtige Weg ist:

yourArray.astype(int)

oder

yourArray.astype(float)
Gioelelm
quelle
3

Ich weiß, dass Sie nach Lösungen ohne Schleifen gefragt haben, aber die einzigen Lösungen, die ich finden kann, sind wahrscheinlich sowieso interne Schleifen:

map(int,y)

oder:

[i*1 for i in y]

oder:

import numpy
y=numpy.array(y)
y*1
bsoist
quelle
Ja, die Schleife ist langsam. Nach dem, was ich gelesen habe, sollten Sie c von Python aus aufrufen, wenn Sie einige Zeit kritisch kritisieren müssen. Kennen Sie Referenzen dafür? Vielen Dank auch für Ihre Hilfe. überrascht, wie schnell alle geantwortet haben!
Kwolf
2

Ein lustiger Weg, dies zu tun, ist

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