【问题标题】:How to create a numpy array of all True or all False?如何创建一个全部为 True 或全部为 False 的 numpy 数组?
【发布时间】:2014-02-06 03:18:29
【问题描述】:

在 Python 中,如何创建一个任意形状的 numpy 数组,其中填充全部为 True 或全部为 False?

【问题讨论】:

    标签: python arrays numpy boolean numpy-ndarray


    【解决方案1】:

    numpy 允许非常轻松地创建全为 1 或全为零的数组:

    例如numpy.ones((2, 2))numpy.zeros((2, 2))

    由于TrueFalse 在Python 中分别表示为10,因此我们只需使用可选的dtype 参数指定此数组应为布尔值,我们就完成了。

    numpy.ones((2, 2), dtype=bool)

    返回:

    array([[ True,  True],
           [ True,  True]], dtype=bool)
    

    更新日期:2013 年 10 月 30 日

    由于 numpy version 1.8,我们可以使用 full 来实现相同的结果,其语法更清楚地表明了我们的意图(正如 fmonegaglia 指出的那样):

    numpy.full((2, 2), True, dtype=bool)

    更新日期:2017 年 1 月 16 日

    由于至少numpy version 1.12full 自动将结果转换为第二个参数的dtype,所以我们可以直接写:

    numpy.full((2, 2), True)

    【讨论】:

    • dtype=int 初始化数组不能用于数组元素选择。
    • 这行得通。但是,要小心,因为正如@Jichao 所说,a=np.ones((2,2)) 后跟a.dtype=bool 不起作用。
    • answer 假定具有 dtype bool 的 np.ones 或 np.zeros 必须将 int 数组转换为布尔值。这个假设是真的吗?我认为它会创建布尔数组并且不会先创建 int 数组然后再进行转换。如果我是对的,请更正这个答案
    【解决方案2】:
    numpy.full((2,2), True, dtype=bool)
    

    【讨论】:

    • +1 我认为这应该是公认的答案。用布尔值填充数组似乎比用数字填充将它们转换为布尔值更自然。
    • oneszeros 答案不构造整数数组。他们直接构建了一个布尔数组。
    • numpy.full((2,2), True) 是等价的吗?
    • 它在 numpy 1.12+ 中。我不记得它是否适用于以前的版本
    • Surly dtype 是否尽可能与数据本身分开存储?我无法想象 numpy 做任何繁重的工作来将 int 1 转换为 bool True
    【解决方案3】:

    oneszeros,分别创建全为 1 和 0 的数组,采用可选的 dtype 参数:

    >>> numpy.ones((2, 2), dtype=bool)
    array([[ True,  True],
           [ True,  True]], dtype=bool)
    >>> numpy.zeros((2, 2), dtype=bool)
    array([[False, False],
           [False, False]], dtype=bool)
    

    【讨论】:

      【解决方案4】:

      如果它不必是可写的,您可以使用np.broadcast_to 创建这样一个数组:

      >>> import numpy as np
      >>> np.broadcast_to(True, (2, 5))
      array([[ True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True]], dtype=bool)
      

      如果你需要它可写,你也可以自己创建一个空数组并fill它:

      >>> arr = np.empty((2, 5), dtype=bool)
      >>> arr.fill(1)
      >>> arr
      array([[ True,  True,  True,  True,  True],
             [ True,  True,  True,  True,  True]], dtype=bool)
      

      这些方法只是替代建议。一般来说,您应该像其他答案所建议的那样坚持使用np.fullnp.zerosnp.ones

      【讨论】:

        【解决方案5】:

        Michael Currie 回答的基准

        import perfplot
        
        bench_x = perfplot.bench(
            n_range= range(1, 200),
            setup  = lambda n: (n, n),
            kernels= [
                lambda shape: np.ones(shape, dtype= bool),
                lambda shape: np.full(shape, True)
            ],
            labels = ['ones', 'full']
        )
        
        bench_x.show()
        

        【讨论】:

          【解决方案6】:

          赶紧跑个timeit看看np.fullnp.ones版本有什么区别。

          答案:

          import timeit
          
          n_array, n_test = 1000, 10000
          setup = f"import numpy as np; n = {n_array};"
          
          print(f"np.ones: {timeit.timeit('np.ones((n, n), dtype=bool)', number=n_test, setup=setup)}s")
          print(f"np.full: {timeit.timeit('np.full((n, n), True)', number=n_test, setup=setup)}s")
          

          结果:

          np.ones: 0.38416870904620737s
          np.full: 0.38430388597771525s
          


          重要

          关于np.empty的帖子(我无法评论,因为我的声誉太低了):

          不要那样做。不要使用np.empty 来初始化一个全True 数组

          由于数组为空,内存没有写入,也无法保证你的值是什么,例如

          >>> print(np.empty((4,4), dtype=bool))
          [[ True  True  True  True]
           [ True  True  True  True]
           [ True  True  True  True]
           [ True  True False False]]
          

          【讨论】:

            【解决方案7】:
            >>> a = numpy.full((2,4), True, dtype=bool)
            >>> a[1][3]
            True
            >>> a
            array([[ True,  True,  True,  True],
                   [ True,  True,  True,  True]], dtype=bool)
            

            numpy.full(大小,标量值,类型)。还有其他参数可以传递,有关文档,请查看https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

            【讨论】:

            • 好吧,another answer 已经使用 np.full 回答了 - 一年多以前!
            猜你喜欢
            • 1970-01-01
            • 2021-12-06
            • 1970-01-01
            • 2021-03-14
            • 2021-12-09
            • 1970-01-01
            • 1970-01-01
            • 2022-01-16
            • 1970-01-01
            相关资源
            最近更新 更多