Python np.full(大小,0)vs.np.zero(大小)vs.np.empty()

Python np.full(大小,0)vs.np.zero(大小)vs.np.empty(),python,arrays,numpy,Python,Arrays,Numpy,如果要从以下三种方法中选择一种来初始化带有零的数组,您会选择哪种方法?为什么 my_arr_1 = np.full(size, 0) 或 或 绝对np.zero。这不仅是最惯用、最常见的方法,也是迄今为止最快的方法: 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,

如果要从以下三种方法中选择一种来初始化带有零的数组,您会选择哪种方法?为什么

my_arr_1 = np.full(size, 0) 


绝对
np.zero
。这不仅是最惯用、最常见的方法,也是迄今为止最快的方法:

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

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

  • 它接受两个语句,而不是一个表达式和

  • 对于NumPy的人来说,优化起来更难。事实上,在努比 1.10,
    np.zeros
    仍然是最快的选项,尽管对索引进行了所有优化:

  • >>%timeit np.zero(1e6)
    1000个回路,最好为3:804µs/回路
    >>>%timeit np.full(1e6,0)
    1000个回路,最好为3个:每个回路816µs
    >>>%timeit a=np.empty(1e6);a[:]=0
    1000个回路,最好为3个:每个回路919µs
    
    与@John Zwinck的结果进行比较的更大数组:

    >>%timeit np.zero(1e8)
    100000个回路,最好为3个:每个回路9.66µs
    >>>%timeit np.full(1e8,0)
    1个回路,最好为3:614毫秒/回路
    >>>%timeit a=np.empty(1e8);a[:]=0
    1个回路,最好为3:229毫秒/回路
    
    np。如果要将数组初始化为零,则零要快得多。如果只想初始化给定形状和类型的数组,而不关心数组中的初始项,
    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)
    
    您可以在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]])
    

    “满”和作业是一样的,当然我想说的是我更喜欢
    a[…]=0
    而不是
    a[:]
    。现在零告诉内核将内存归零。不,但在我的测量中没有:)@seberg:基于这一点,以及1e6和1e8情况的时间,我猜
    np.zeros()
    最终使用了一个匿名
    mmap()
    超过某个阈值(
    np.empty())
    可能也使用了它,设置了
    MAP\u未初始化
    标志),并且内存在第一次读/写之前没有归零,甚至没有正确分配,这使得计时或多或少毫无用处。(例如,对所有测量中的阵列执行
    np.sum()
    可能会给出更合理的结果)这正是
    np.zero
    的目的。你为什么不使用它?实际上我正在使用它。然而,我不确定这些方法中哪一种在时间和内存使用方面是最有效的!你在拿苹果和桔子作比较
    np.zero(n)
    不会给出与
    np.empty(n)
    相同的结果。这已经在@FredFoo的解决方案中解释过了。好的,谢谢你纠正我。所以如果只是初始化,np.empty稍微快一点;如果初始化为零,np.zero会快得多。当然。但有两个不同的问题:(1)不同的输出,(2)速度。实际上,只有(1)项是重要的。有趣的注意:如果数组形状不是1D,
    >>%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)
    
    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]])