Как преобразовать логический массив в массив 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.