2013-07-06 10 views
62

Ich benutze Scilab, und will eine Reihe von booleans in ein Array von ganzen Zahlen konvertieren:Wie ein boolean-Array in eine int-Array 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 sogar vermehren nur um 1:

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

gibt es einen einfachen Befehl für diesen in Python, oder hätte ich eine Schleife benutzen?

+0

Fragen Sie nach einer Möglichkeit, ein boolesches Array in ein Integer ohne scipy, numpy und ähnliches zu konvertieren? –

+0

Es gibt eine separate Möglichkeit zum Formatieren von Code. Sie müssen nicht blockquote verwenden. Es wird durch Einrücken gemacht, und die geschweifte Klammern-Schaltfläche oberhalb des Frageneditors erledigt das für Sie. Hör zu. – Marcin

+0

Sukrit, es ist mir egal, ob ich scipy, numpy oder ein anderes Python-Modul-Paket verwenden muss. – Kwolf

Antwort

78

Numpy Arrays haben eine astype Methode. Tun Sie einfach y.astype(int).

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

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

ja, ich kann auch x * 1 eingeben ... und es tut das selbe was scilab macht .... * fühlt sich jetzt an wie dumm * danke euch allen für euch hilfe! .... obwohl die antwort war In meiner Frage mochte ich es sehr, die Vielfalt der Antworten zu bekommen und all die verschiedenen Möglichkeiten zu sehen. Wirklich meine Meinung zu Python. – Kwolf

22

Die 1*y Methode funktioniert in Numpy zu:

>>> 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 für eine Art und Weise zu fragen Python Listen von Boolean zu konvertieren int, können Sie map es zu tun verwenden:

>>> 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 mit Listenkomprehensionen:

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

Also, "y = 1, wenn x else 0" dasselbe ist wie "y = 1 wenn x> 0 else 0" und dasselbe wie "wenn x: y = 1" "NEXT LINE" "sonst: y = 0" .... wie hast du diese Tricks gelernt, ich habe es in der _if statement_ Dokumentation nicht gesehen? – Kwolf

+0

Nr. 'Y = 1, wenn x else 0' nicht dasselbe ist wie 'y = 1 wenn x> 0 else 0', da letzteres die negativen Zahlen nicht berücksichtigt. Dies ist genau das, was Python als "True" oder "False" definiert, diese sind alle in der Dokumentation. –

12

Mit numpy können Sie tun:

y = x.astype(int) 

Wenn Sie eine nicht-numpy Array verwendet haben, könnten Sie ein list comprehension verwenden:

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

Ich weiß, dass Sie nicht gefragt -Looping-Lösungen, aber die einzigen Lösungen, die ich kann wahrscheinlich kommen Schleife wahrscheinlich sowieso:

map(int,y) 

oder:

[i*1 for i in y] 

oder:

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

ja, die Schleife ist langsam. von dem, was ich gelesen habe, sollten Sie c von Python aufrufen, wenn Sie einige Zeit kritisch Crunching tun müssen. Kennst du Referenzen dafür? auch, danke für Ihre Hilfe. überrascht, wie schnell alle reagierten! – Kwolf

4

Die meiste Zeit Sie Umwandlung nicht brauchen:

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

Der richtige Weg, es zu tun ist:

yourArray.astype(int) 

oder

yourArray.astype(float) 
Verwandte Themen