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?


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

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]

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


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)

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

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])
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.