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

Я использую 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, или мне нужно использовать цикл?

Ответ 1

Массивы Numpy имеют метод astype. Просто сделайте y.astype(int).

Обратите внимание, что это даже не нужно делать, в зависимости от того, для чего вы используете массив. В большинстве случаев Bool будет автоматически преобразован в int, поэтому вы можете добавить его в массивы int без необходимости его явного преобразования:

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

Ответ 2

Метод 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 из Boolean в 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]

Ответ 3

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

y = x.astype(int)

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

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

Ответ 4

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

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

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

yourArray.astype(int)

или

yourArray.astype(float)

Ответ 5

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

map(int,y)

или

[i*1 for i in y]

или

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

Ответ 6

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

>>> np.array([True, False, False]) + 0 
np.array([1, 0, 0])