Dat*_*man 18 python arrays numpy
如果您选择以下三种方法之一来初始化一个零的数组,您会选择哪一个?为什么?
my_arr_1 = np.full(size, 0)
Run Code Online (Sandbox Code Playgroud)
要么
my_arr_2 = np.zeros(size)
Run Code Online (Sandbox Code Playgroud)
要么
my_arr_3 = np.empty(size)
my_arr_3[:] = 0
Run Code Online (Sandbox Code Playgroud)
Fre*_*Foo 12
我用它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
Run Code Online (Sandbox Code Playgroud)
与@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
Run Code Online (Sandbox Code Playgroud)
np.zeros
如果想将数组初始化为零,则速度要快得多。如果只想初始化给定形状和类型的数组但不关心数组中的初始条目,np.empty
则速度会稍快一些。
请参阅以下基本测试结果:
\n\n>>%timeit np.zeros(1000000)\n7.89 \xc2\xb5s \xc2\xb1 282 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n\n>>%timeit np.empty(1000000)\n7.84 \xc2\xb5s \xc2\xb1 332 ns per loop (mean \xc2\xb1 std. dev. of 7 runs, 100000 loops each)\n
Run Code Online (Sandbox Code Playgroud)\n
当然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
Run Code Online (Sandbox Code Playgroud)