Як перетворити булевий масив в масив int


129

Я використовую Scilab і хочу перетворити масив булевих масивів у масив цілих чисел:

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

У Scilab я можу використовувати:

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

або навіть просто помножте його на 1:

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

Чи є в Python проста команда для цього чи мені доведеться використовувати цикл?


Ви запитуєте спосіб перетворення булевого масиву в ціле число без scipy, numpy тощо?
Сукрит Калра

Існує окремий спосіб форматування коду. Не потрібно використовувати блок-котирування. Це робиться відступом, і кнопка фігурних дужок над редактором запитів зробить це за вас. Перевір.
Marcin

Сукрит, мені все одно, чи доведеться мені використовувати scipy, numpy чи будь-який інший пакет модулів python.
Kwolf

Відповіді:


167

Numpy масиви мають astypeметод. Просто роби y.astype(int).

Зауважте, що це може бути навіть не потрібно робити, залежно від того, для чого ви використовуєте масив. У багатьох випадках Bool буде автоматизований до int, тож ви можете додати його до масивів int без явного перетворення:

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

5
так, я також можу набрати x * 1 ... і він робить те саме, що робить scilab .... * відчуває себе німим зараз * .. дякую всім за допомогу! .... хоча відповідь була правильною у моїй питання, мені дуже сподобалось отримати різноманітні відповіді та побачити всі різні способи це зробити. Дійсно відкрив свою думку щодо пітона.
Kwolf

Повторені булеві масиви, які автоматично автомобілізовані: на жаль, numpy не відповідає цьому. Спробуйте відняти два булевих масиви, і ви отримаєте TypeError та повідомлення про депрекацію.
oulenz

52

1*yМетод працює в 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]) 

Якщо ви запитуєте спосіб перетворення списків Python з булевого в int, ви можете використовувати mapце:

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

Або використовуючи розуміння списку:

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

так, y = 1 if x else 0 це те саме, що y = 1 if x>0 else 0і те саме, як if x: y = 1 ""NEXT LINE"" else: y = 0.... як ви дізналися ці хитрощі, я не бачив цього в документації if заяви ?
Kwolf

Ні. y=1 if x else 0Це не те саме, що y=1 if x>0 else 0, оскільки останні не враховують від’ємні числа. Це саме те, що Python визначає як Trueабо False, це все в документації.
Сукрит Калра

24

Використовуючи numpy, ви можете:

y = x.astype(int)

Якщо ви використовували масив, який не є нумером, ви можете використовувати розуміння списку :

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

14

Більшість часу вам не потрібна конверсія:

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

Правильний спосіб зробити це:

yourArray.astype(int)

або

yourArray.astype(float)

3

Я знаю, що ви попросили неконтурюваних рішень, але єдині рішення, з якими я можу придумати, швидше за все, внутрішню петлю:

map(int,y)

або:

[i*1 for i in y]

або:

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

так, циклічне завершення відбувається повільно. з того, що я читав, якщо вам потрібно зробити критичний хрускіт через деякий час, вам слід зателефонувати c з python. Чи знаєте ви якісь посилання на це? також дякую за допомогу. здивовано, як швидко всі відгукнулися!
Kwolf

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.