Как преобразовать логический массив в массив 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 простая команда для этого или мне придется использовать цикл?

Kwolf
источник
Вы спрашиваете, как преобразовать логический массив в целочисленный без 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])
BrenBarn
источник
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]
CJM
источник
14

В большинстве случаев преобразование не требуется:

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

Правильный способ сделать это:

yourArray.astype(int)

или

yourArray.astype(float)
Gioelelm
источник
3

Я знаю, что вы просили о решениях, не связанных с циклом, но единственные решения, которые я могу придумать, вероятно, все равно зацикливаются внутри:

map(int,y)

или:

[i*1 for i in y]

или:

import numpy
y=numpy.array(y)
y*1
bsoist
источник
да, зацикливание идет медленно. из того, что я прочитал, если вам нужно сделать критический по времени хруст, вы должны вызвать c из python. Вы знаете какие-нибудь рекомендации по этому поводу? также спасибо за вашу помощь. удивлен, как быстро все отреагировали!
Kwolf 06
3

Забавный способ сделать это

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])
Томас Г.
источник