【问题标题】:How to convert a boolean array to an int array如何将布尔数组转换为int数组
【发布时间】:2013-07-04 13:50:39
【问题描述】:

我使用 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,我不在乎我是否必须使用 scipy、numpy 或任何其他 python 模块包。

标签: python integer boolean type-conversion scilab


【解决方案1】:

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

请注意,甚至可能没有必要这样做,具体取决于您使用数组的目的。在许多情况下,Bool 会自动提升为 int,因此您可以将其添加到 int 数组中,而无需显式转换:

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

【讨论】:

  • 是的,我也可以输入 x*1...它和 scilab 做的一样...*现在感觉像个笨蛋*.. 谢谢大家的帮助!... .虽然答案在我的问题中是正确的,但我真的很喜欢得到各种各样的答案并看到所有不同的方法来做到这一点。真的让我对 python 大开眼界。
  • 重新自动提升布尔数组:不幸的是,numpy 与此不一致。尝试减去两个布尔数组,你会得到一个 TypeError 和一个弃用消息。
【解决方案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]

【讨论】:

  • 所以,y = 1 if x else 0y = 1 if x>0 else 0 相同,与if x: y = 1 ""NEXT LINE"" else: y = 0 相同......你是怎么学会这些技巧的,我在 if 中没有看到声明 文件?
  • 没有。 y=1 if x else 0y=1 if x>0 else 0 不同,因为后者不考虑负数。这正是 Python 定义为 TrueFalse 的内容,这些都在文档中。
【解决方案3】:

使用 numpy,你可以做到:

y = x.astype(int)

如果您使用的是非 numpy 数组,则可以使用 list comprehension:

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】:

      一个有趣的方法是

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

      【讨论】:

        【解决方案6】:

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

        map(int,y)
        

        或:

        [i*1 for i in y]
        

        或:

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

        【讨论】:

        • 是的,循环很慢。从我读过的内容来看,如果你需要做一些时间紧迫的处理,你应该从 python 调用 c 。你知道这样做的任何参考吗?另外,感谢您的帮助。惊讶于每个人的反应速度如此之快!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-12
        • 1970-01-01
        • 2014-12-20
        • 2014-08-10
        • 2016-01-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多