2015-09-04 92 views
3

當我使用resize方法縮小numpy數組時(即數組因爲resize而變小),是否保證不做複製?將NumPy數組的大小調整爲較小的大小而無需複製

例子:

a = np.arange(10)   # array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
a.resize(5, refcheck=False) # array([0, 1, 2, 3, 4]) 

從我的理解這應該是儘可能不進行復制。我的問題:這個實現是否確實確保這種情況總是如此?不幸的是,resize的文檔沒有提到它。

+1

如果您的新尺寸總是會更小,爲什麼不切片數組並分配給自己? – EdChum

+0

@EdChum:你的意思是'a = a [:5]'?說實話,我沒有想到這個選擇。不過,我不知道內部是如何切片的。這是否會在沒有任何數據副本的情況下工作? – luator

回答

3

numpy數組在背景中是一個固定大小的數組,任何類型的大小總是會複製數組。如上所述,您可以僅使用數組的子集而無需調整大小/複製來有效地創建數組的片段。

>>> import numpy 
>>> a = numpy.arange(10) 
>>> b = a[:5] 
>>> a 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 
>>> b 
array([0, 1, 2, 3, 4]) 
>>> 
>>> a += 10 
>>> a 
array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 
>>> b 
array([10, 11, 12, 13, 14]) 
>>> 
>>> b += 10 
>>> a 
array([20, 21, 22, 23, 24, 15, 16, 17, 18, 19]) 
>>> b 
array([20, 21, 22, 23, 24]) 
+0

謝謝,我沒有真正意識到我可以使用切片。然而,這有一個警告:對於'a'的未使用部分的內存沒有被釋放(在某些情況下這可能是個問題)。如果我做'del a'會怎麼樣?它會保留完整的數據還是足夠聰明,只保留可通過'b'訪問的部分? – luator

+1

當做'del a'時,它會完全保留'a',因爲它仍然存在。 'b'只顯示「a」的一小部分,但它仍然存在。實際釋放內存的唯一方法是將其複製到一個新陣列並刪除舊陣列。在後臺numpy只是在創建/刪除數組時創建一個標準的'malloc' /'free',並且不能'釋放'c中的數組的一部分。 – Wolph

+0

另一個問題:爲什麼'resize'必須在縮小數組時進行復制?我不擅長內存分配的工作方式,但是不應該只釋放分配內存的最後部分並保留前部分而不復制任何東西? – luator