Np.full(размер, 0) против np.zeros(размер) vs. np.empty()

Если вам нужно было выбрать один из следующих трех способов инициализации массива с нулями, которые вы бы выбрали, и почему?

my_arr_1 = np.full(size, 0) 

или

my_arr_2 = np.zeros(size)

или

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

Ответ 1

Я бы использовал np.zeros из-за его имени. Я бы никогда не использовал третий идиом, потому что (1) он принимает два утверждения вместо одного выражения и (2) для оптимизаторов NumPy труднее. Фактически, в NumPy 1.10 np.zeros по-прежнему является самым быстрым вариантом, несмотря на все оптимизации индексирования:

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

Большой массив для сравнения с результатами @John Zwinck:

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

Ответ 2

Определенно np.zeros. Мало того, что это самый идиоматический и распространенный способ сделать это, он также является самым быстрым:

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

Ответ 3

np.zeros намного быстрее, если кто-то хочет инициализировать массив нулями. В случае, если кто-то просто хочет инициализировать массив заданной формы и типа, но не заботится о начальных записях в массиве, np.empty немного быстрее.

Смотрите следующие основные результаты теста:

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

Ответ 4

np.zero():always 0
np.empty():Random number, depending on memory condition

Вы можете увидеть следующее в 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]])