2014-10-06 130 views
6

如果您要选择以下三种初始化零的数组中的一种,您可以选择其中一种,并且为什么np.full(size,0)与np.zeros(size)与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 
+0

这正是'NP .zeros'是为。为什么*不会使用它? – 2014-10-06 12:34:12

+0

我正在使用它。但是,我不确定哪种方法在时间和内存使用方面效率最高! – Dataman 2014-10-06 12:50:32

回答

3

我会用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 

更大的阵列与@约翰Z​​winck的结果进行比较:

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

“完整”和赋值是相同的,尽管我当然想提到我更喜欢'a [...] = 0'而不是'a [:]'。时下的零告诉内核清零内存。 – seberg 2014-10-06 10:02:05

+1

@seberg这并不能解释为什么'full'比'[:] = 0'慢得多...... – 2014-10-06 10:03:15

+0

不是,但它不在我的测量范围内:) – seberg 2014-10-07 15:05:23

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