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

192

我使用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
有一种单独的代码格式化方式。您不必使用引用块。它是通过缩进完成的,问题编辑器上方的花括号按钮将为您完成此操作。试试看。 - Marcin
Sukrit,我不在乎是否必须使用scipy、numpy或任何其他Python模块包。 - Kwolf
6个回答

239

Numpy数组有一个astype方法。只需执行y.astype(int)

请注意,根据您使用数组的方式,可能甚至不需要这样做。在许多情况下,布尔值将自动提升为int,因此您可以将其添加到int数组中而无需显式转换:

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

9
是的,我也可以输入x*1...这样做与Scilab做的一样...感觉自己很蠢...谢谢大家的帮助! ...虽然答案就在我的问题中,但我真的很喜欢得到不同的答案,并看到所有不同的方法来完成它。这真的开阔了我关于Python的思路。 - Kwolf
1
关于布尔数组的自动提升:不幸的是,NumPy 在这方面并不一致。尝试减去两个布尔数组,你会得到一个 TypeError 和一个弃用消息。 - oulenz

75

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 的布尔列表转换为整数,可以使用 map 来实现:

如果您要将 Python 列表从布尔型转换为整数,可以使用 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]

1
所以,y = 1 if x else 0y = 1 if x>0 else 0以及if x: y = 1 ""NEXT LINE"" else: y = 0是相同的......你是怎么学会这些技巧的?我在_if语句_文档中没有看到过。 - Kwolf
不,y=1 if x else 0y=1 if x>0 else 0 不同,因为后者没有考虑负数。这只是Python中定义的TrueFalse,这些都在文档中有说明。 - Sukrit Kalra
y.astype(int)1*y0+y 快 2.5 倍。https://perfpy.com/160 - Maxim Egorushkin

37

使用numpy,您可以执行:

y = x.astype(int)

如果您正在使用非numpy数组,您可以使用列表推导式

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

20

大多数情况下,您不需要进行转换:

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

正确的做法是:

yourArray.astype(int)
或者
yourArray.astype(float)

10

一个有趣的方法是

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

3

我知道你要求不使用循环的解决方案,但是我能想到的解决方案可能仍需要内部循环:

map(int,y)

或者:

[i*1 for i in y]

或者:

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

是的,循环速度较慢。根据我所了解的,如果您需要进行一些时间关键的计算,您应该从Python中调用C语言。您知道如何做这个的参考资料吗? 另外,非常感谢您的帮助。大家的反应都很快,让我感到惊讶! - Kwolf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接