2014-10-06 133 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