How to create a numpy array of all True or all False?

前端 未结 7 2074
醉话见心
醉话见心 2020-12-07 09:24

In Python, how do I create a numpy array of arbitrary shape filled with all True or all False?

相关标签:
7条回答
  • 2020-12-07 09:37

    benchmark for Michael Currie's answer

    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()
    

    0 讨论(0)
  • 2020-12-07 09:41

    ones and zeros, which create arrays full of ones and zeros respectively, take an optional dtype parameter:

    >>> 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)
    
    0 讨论(0)
  • 2020-12-07 09:46

    If it doesn't have to be writeable you can create such an array with 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)
    

    If you need it writable you can also create an empty array and fill it yourself:

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

    These approaches are only alternative suggestions. In general you should stick with np.full, np.zeros or np.ones like the other answers suggest.

    0 讨论(0)
  • 2020-12-07 09:52

    Quickly ran a timeit to see, if there are any differences between the np.full and np.ones version.

    Answer: No

    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")
    

    Result:

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


    IMPORTANT

    Regarding the post about np.empty (and I cannot comment, as my reputation is too low):

    DON'T DO THAT. DON'T USE np.empty to initialize an all-True array

    As the array is empty, the memory is not written and there is no guarantee, what your values will be, e.g.

    >>> print(np.empty((4,4), dtype=bool))
    [[ True  True  True  True]
     [ True  True  True  True]
     [ True  True  True  True]
     [ True  True False False]]
    
    0 讨论(0)
  • 2020-12-07 09:54

    numpy already allows the creation of arrays of all ones or all zeros very easily:

    e.g. numpy.ones((2, 2)) or numpy.zeros((2, 2))

    Since True and False are represented in Python as 1 and 0, respectively, we have only to specify this array should be boolean using the optional dtype parameter and we are done.

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

    returns:

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

    UPDATE: 30 October 2013

    Since numpy version 1.8, we can use full to achieve the same result with syntax that more clearly shows our intent (as fmonegaglia points out):

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

    UPDATE: 16 January 2017

    Since at least numpy version 1.12, full automatically casts results to the dtype of the second parameter, so we can just write:

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

    0 讨论(0)
  • 2020-12-07 09:56
    numpy.full((2,2), True, dtype=bool)
    
    0 讨论(0)
提交回复
热议问题