如何将布尔数组转换为整型数组

我使用了 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 中有没有这样一个简单的命令,或者我必须使用一个循环?

361465 次浏览

Numpy 数组有一个 astype方法。

请注意,根据您使用数组的目的,甚至可能不需要这样做。在许多情况下,Bool 会自动升级为 int,因此您可以将它添加到 int 数组中,而不必显式地转换它:

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

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]

使用 numpy,您可以:

y = x.astype(int)

如果您使用的是非数值型数组,那么您可以使用 列表内涵:

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

我知道你要求非循环解决方案,但我能想到的唯一解决方案可能是内部循环:

map(int,y)

或:

[i*1 for i in y]

或:

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

大多数时候你不需要转换:

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

正确的做法是:

yourArray.astype(int)

或者

yourArray.astype(float)

有趣的是

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