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

时间:2014-10-06 09:18:17

标签: python arrays numpy

如果您选择以下三种方法之一来初始化一个零的数组,您可以选择哪一种为什么

my_arr_1 = np.full(size, 0) 

my_arr_2 = np.zeros(size)

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

4 个答案:

答案 0 :(得分:10)

我使用np.zeros,因为它的名字。我永远不会使用第三个成语,因为

  1. 它需要两个语句而不是一个表达式

  2. NumPy人员更难以优化。事实上,在NumPy 1.10,np.zeros仍然是最快的选择,尽管所有优化都要编制索引:

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

答案 1 :(得分:6)

绝对是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

答案 2 :(得分:1)

如果要将数组初始化为零,

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)

答案 3 :(得分:0)

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

您可以看到以下内容进行露营

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