2016-12-26 198 views
0

我有一個巨大的numpy.ndarray圖像0​​,加載到RAM時需要60GB。我需要刪除該數組的最後一個n元素。一個簡單的解決方案是:刪除numpy.ndarray的最後N個元素後的內存

array1 = array1[:n-1] 

但是當我這樣做時,我沒有獲得RAM中的任何空間,爲什麼呢? 由於刪除了這些元素,我如何獲得RAM中的可用空間?我原本是爲了這個收益去做的。

+0

看的文檔的'NP。調整大小' – hpaulj

回答

1

array1[:n-1]是一個視圖,一個新的數組與原始的array1共享數據緩衝區。即使您重新指定array1,其數據緩衝區也不會調整大小。

array1.resize(n-1) - 文檔指示數據緩衝區被調整大小/重新分配,只要明確表示該緩衝區不與其他任何內容共享即可。

In [1105]: arr=np.arange(1000) 
In [1106]: arr.nbytes 
Out[1106]: 4000 
In [1107]: sys.getsizeof(arr) # those bytes plus overhead 
Out[1107]: 4048 
In [1108]: arr = arr[:500]  # your slice 
In [1109]: arr.nbytes   # fewer bytes 
Out[1109]: 2000 
In [1110]: sys.getsizeof(arr) # just the overhead 
Out[1110]: 48 

sys.getsizeof獲取視圖的大小,但由於這股緩衝區與原arr,我們看到的只是「開銷」。原始arr仍然存在,但它不能通過名稱訪問。

In [1111]: arr=np.arange(1000) 
In [1112]: arr.resize(500) 
In [1113]: arr.nbytes 
Out[1113]: 2000 
In [1114]: sys.getsizeof(arr) 
Out[1114]: 2048 

隨着resize方法看來該數據緩衝器已被調整大小,釋放了它的一半。但我不確定是否有很好的測試方法,至少不是像這樣的小數組。

可能我們有3個系統管理內存 - numpy,python解釋器和系統。我們不得不進一步深入代碼(可能是C-api),以確定在resize之後內存是否被添加到某種numpy緩存中,或者被Python垃圾收集器收集或被返回到系統。

============

resize下一個新的shape似乎減少沿第一軸的尺寸:

In [1120]: arr = np.arange(100).reshape(10,10).copy() 
In [1121]: arr.resize(50) 
In [1122]: sys.getsizeof(arr) 
Out[1122]: 248 
In [1123]: arr = np.arange(100).reshape(10,10).copy() 
In [1124]: sys.getsizeof(arr) 
Out[1124]: 456 
In [1125]: arr.resize(50) 
In [1126]: sys.getsizeof(arr) 
Out[1126]: 248 
In [1127]: arr.shape 
Out[1127]: (50,) 
In [1128]: arr.shape=(5,10) # inplace reshape 
In [1129]: arr 
Out[1129]: 
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 
     [10, 11, 12, 13, 14, 15, 16, 17, 18, 19], 
     [20, 21, 22, 23, 24, 25, 26, 27, 28, 29], 
     [30, 31, 32, 33, 34, 35, 36, 37, 38, 39], 
     [40, 41, 42, 43, 44, 45, 46, 47, 48, 49]]) 
+0

只要它是第一個軸,'resize'後跟一個就地'reshape'似乎工作。 – hpaulj

相關問題