如何将布尔数组转换为int数组


129

我使用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

有另一种格式化代码的方式。您不必使用blockquote。通过缩进即可完成,问题编辑器上方的花括号按钮将为您完成。看看这个。
Marcin

Sukrit,我不在乎是否必须使用scipy,numpy或任何其他python模块包。

Answers:


167

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的功能相同.... *现在像dumbass一样* ..谢谢大家的帮助!问题,我真的很喜欢得到各种各样的答案,并看到所有不同的方式来做到这一点。真正让我对python敞开心mind。

重新布尔数组被自动提升:不幸的是,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列表从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]

所以,... 和... y = 1 if x else 0 一样y = 1 if x>0 else 0,一样,if x: y = 1 ""NEXT LINE"" else: y = 0您是如何学习这些技巧的,我在if语句文档中没有看到它?

编号y=1 if x else 0与并不相同y=1 if x>0 else 0,因为后者没有考虑负数。这就是Python定义为True或的内容False,这些都在文档中。
Sukrit Kalra

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

是的,循环很慢。从我读到的内容来看,如果您需要做一些关键的运算,则应该从python调用c。您知道这样做的任何参考吗?另外,谢谢您的帮助。惊讶每个人的反应如此之快!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.