Jak przekonwertować tablicę logiczną na tablicę int

129

Używam Scilaba i chcę przekonwertować tablicę wartości logicznych na tablicę liczb całkowitych:

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

W Scilabie mogę użyć:

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

lub nawet pomnóż to przez 1:

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

Czy jest do tego proste polecenie w Pythonie, czy musiałbym użyć pętli?

Kwolf
źródło
Czy pytasz o sposób na przekonwertowanie tablicy boolowskiej na liczbę całkowitą bez scipy, numpy i tym podobnych?
Sukrit Kalra,
Istnieje oddzielny sposób formatowania kodu. Nie musisz używać cytatów blokowych. Robi się to przez wcięcie, a przycisk nawiasów klamrowych nad edytorem pytań zrobi to za Ciebie. Sprawdź to.
Marcin
Sukrit, nie obchodzi mnie, czy muszę używać scipy, numpy lub jakiegokolwiek innego pakietu modułów Pythona.
Kwolf

Odpowiedzi:

167

Tablice Numpy mają astypemetodę. Po prostu zrób y.astype(int).

Zwróć uwagę, że może to nawet nie być konieczne, w zależności od tego, do czego używasz tablicy. W wielu przypadkach Bool zostanie automatycznie przeniesiony do int, więc możesz dodać go do tablic int bez konieczności jawnej konwersji:

>>> x
array([ True, False,  True], dtype=bool)
>>> x + [1, 2, 3]
array([2, 2, 4])
BrenBarn
źródło
5
tak, mogę też wpisać x * 1 ... i robi to samo, co scilab .... * czuje się teraz jak głupek * .. dziękuję wszystkim za pomoc! .... chociaż odpowiedź była w moim pytanie, bardzo podobało mi się otrzymywanie różnorodnych odpowiedzi i różne sposoby, aby to zrobić. Naprawdę otworzyłem mój umysł na temat Pythona.
Kwolf
Tablice re boolowskie są autopromocowane: niestety numpy nie jest z tym zgodne. Spróbuj odjąć dwie tablice logiczne, a otrzymasz TypeError i komunikat o wycofaniu.
oulenz
52

1*yMetoda działa w NumPy też:

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

Jeśli pytasz o sposób na konwersję list Pythona z Boolean na int, możesz mapto zrobić:

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

Lub używając list składanych:

>>> testList
[False, False, True, True]
>>> [int(elem) for elem in testList]
[0, 0, 1, 1]
Sukrit Kalra
źródło
więc y = 1 if x else 0 jest to to samo y = 1 if x>0 else 0i to samo co if x: y = 1 ""NEXT LINE"" else: y = 0.... jak nauczyłeś się tych sztuczek, nie widziałem tego w dokumentacji instrukcji if ?
Kwolf
Nie, y=1 if x else 0to nie to samo co y=1 if x>0 else 0, ponieważ ta ostatnia nie bierze pod uwagę liczb ujemnych. To jest właśnie to, co Python definiuje jako Truelub False, wszystko to znajduje się w dokumentacji.
Sukrit Kalra,
24

Używając numpy, możesz:

y = x.astype(int)

Jeśli używasz tablicy innej niż numpy, możesz użyć rozumienia listowego :

y = [int(val) for val in x]
cjm
źródło
14

W większości przypadków nie potrzebujesz konwersji:

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

Właściwy sposób to:

yourArray.astype(int)

lub

yourArray.astype(float)
Gioelelm
źródło
3

Wiem, że prosiłeś o rozwiązania niezwiązane z zapętleniem, ale jedyne rozwiązania, które mogę wymyślić, prawdopodobnie i tak zapętlają się wewnętrznie:

map(int,y)

lub:

[i*1 for i in y]

lub:

import numpy
y=numpy.array(y)
y*1
bsoist
źródło
tak, pętla jest powolna. z tego, co przeczytałem, jeśli potrzebujesz jakiegoś krytycznego czasu, powinieneś wywołać c z Pythona. Czy znasz jakieś referencje, jak to zrobić? również dziękuję za pomoc. zaskoczony, jak szybko wszyscy odpowiedzieli!
Kwolf
2

Zabawnym sposobem na to jest

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Thomas G.
źródło