Как преобразовать логический массив в массив int


130

Я использую 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 и т.п.?
— Sukrit Kalra 06

Есть отдельный способ форматирования кода. Вам не нужно использовать цитату. Это делается с помощью отступов, и кнопка фигурных скобок над редактором вопросов сделает это за вас. Проверить это.
— Marcin

Сукрит, меня не волнует, нужно ли мне использовать scipy, numpy или любой другой пакет модуля Python.
— Kwolf 06

Ответы:


168

У массивов 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 06

Повторно автоматическое продвижение логических массивов: к сожалению, 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, все это в документации.
— Sukrit Kalra 07

24

Используя numpy, вы можете:

y = x.astype(int)

Если вы использовали массив без numpy, вы могли бы использовать понимание списка :

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 06

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.