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
,因为它的名字。我永远不会使用第三个成语,因为
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]])