307

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

7 Answers 7

439

The answer:

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

Explanation:

numpy creates 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 to the dtype of the second parameter, so we can just write:

numpy.full((2, 2), True) 
Sign up to request clarification or add additional context in comments.

3 Comments

dtype=int initialized array cannot be used for array element selection.
This works. However, be careful because as @Jichao says, a=np.ones((2,2)) followed by a.dtype=bool does NOT work.
answer assumes that np.ones or np.zeros with dtype bool have to cast int array as boolean. Is this assumption true? I think it creates boolean array and doesn't create int array first and then cast. Kindly correct this answer if I am right
110
numpy.full((2,2), True, dtype=bool) 

7 Comments

+1 I think this should be the accepted answer. It seems more natural to fill an array with bools, than to fill it with numbers to cast them to bools.
The ones and zeros answers do not construct an array of integers. They build an array of bools directly.
Is numpy.full((2,2), True) an equivalent?
It is in numpy 1.12+. I dont remember whether it applies to former versions either
full tends to be much slower than ones or zeros
|
33

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) 

Comments

9

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.

Comments

8

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

enter image description here

1 Comment

Glad to see that full has only a fixed time penalty, and not a time penalty that scales with the size of the array. So the larger the array, the less important this difference becomes.
6

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]] 

Comments

-1
>>> 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(Size, Scalar Value, Type). There is other arguments as well that can be passed, for documentation on that, check https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

1 Comment

Well, another answer already answered using np.full - more than one year ago!

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.