np.full(size, 0) vs. np.zeros(size) vs. np.empty()

Question:

If you were to choose one of the following three ways of initializing an array with zeros which one would you choose and why?

my_arr_1 = np.full(size, 0) 

or

my_arr_2 = np.zeros(size)

or

my_arr_3 = np.empty(size)
my_arr_3[:] = 0
Asked By: Dataman

||

Answers:

Definitely np.zeros. Not only is it the most idiomatic and common way to do this, it is also by far the fastest:

In [1]: size=100000000

In [3]: %timeit np.full(size, 0)
1 loops, best of 3: 344 ms per loop

In [4]: %timeit np.zeros(size)
100000 loops, best of 3: 8.75 µs per loop

In [5]: %timeit a = np.empty(size); a[:] = 0
1 loops, best of 3: 322 ms per loop
Answered By: John Zwinck

I’d use np.zeros, because of its name. I would never use the third idiom because

  1. it takes two statements instead of a single expression and

  2. it’s harder for the NumPy folks to optimize. In fact, in NumPy
    1.10, np.zeros is still the fastest option, despite all the optimizations to indexing:

>>> %timeit np.zeros(1e6)
1000 loops, best of 3: 804 µs per loop
>>> %timeit np.full(1e6, 0)
1000 loops, best of 3: 816 µs per loop
>>> %timeit a = np.empty(1e6); a[:] = 0
1000 loops, best of 3: 919 µs per loop

Bigger array for comparison with @John Zwinck’s results:

>>> %timeit np.zeros(1e8)
100000 loops, best of 3: 9.66 µs per loop
>>> %timeit np.full(1e8, 0)
1 loops, best of 3: 614 ms per loop
>>> %timeit a = np.empty(1e8); a[:] = 0
1 loops, best of 3: 229 ms per loop
Answered By: Fred Foo

np.zeros is much faster if one wants to initialize an array to zeros. In the case that one just wants to initialize an array of given shape and type but doesn’t care the initial entries in the array, np.empty is slightly faster.

See the following basic test results:

>>%timeit np.zeros(1000000)
7.89 µs ± 282 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

>>%timeit np.empty(1000000)
7.84 µs ± 332 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Answered By: l001d
np.zero():always 0
np.empty():Random number, depending on memory condition

you can see the following to campare

np.zeros( (3,4) )
array([[ 0.,  0.,  0.,  0.],
...    [ 0.,  0.,  0.,  0.],
...    [ 0.,  0.,  0.,  0.]])


np.empty((3,4))
array([[1.13224202e+277, 1.73151846e-077, 1.24374310e-047,1.30455491e-076],
       [3.92384790e+179, 6.01353875e-154, 3.12452337e-033,7.72229932e+140],
       [1.28654694e-320, 0.00000000e+000, 0.00000000e+000,0.00000000e+000]])
Answered By: chenxuZhu

First, We should understand the difference between these three which help us to choose one of them.

  1. np.zeros(size): Produce an array of all 0s with the given shape.
np.zeros(5)    #array([0., 0., 0., 0., 0.])
  1. np.empty(5): The empty creates an array whose initial content is random and depends on the state of the memory.
np.empty(4)    #array([0.00000000e+000, 1.05915457e-311, 1.05915457e-311, 1.05915457e-311])
  1. np.full(size, fill_value): Return a new array of given shape and type, filled with fill_value.
np.full((2, 2), 10)      #array([[10, 10],
                                 [10, 10]])  

So, In this case np.zeros(size) is obviously right choose and also the fast way to create an array filled with zeros.

Answered By: Haroon Hayat
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.