In Python, how do I create a numpy array of arbitrary shape filled with all True or all False?
7 Answers
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) 3 Comments
a=np.ones((2,2)) followed by a.dtype=bool does NOT work.numpy.full((2,2), True, dtype=bool) 7 Comments
ones and zeros answers do not construct an array of integers. They build an array of bools directly.numpy.full((2,2), True) an equivalent?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
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() 1 Comment
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.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
>>> 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
np.full - more than one year ago!