2016-12-26 26 views
0

numpy.ndarrayの画像array1は、RAMにロードされたときに60GB必要です。その配列の最後のn要素を削除する必要があります。簡単な解決策は次のようになります:numpy.ndarrayの最後のN個の要素を削除した後のメモリ

array1 = array1[:n-1] 

しかし、私がそれをするとき、私はRAMに何もスペースを得ません、なぜですか? これらの要素を削除したため、RAMに空き領域を確保するにはどうすればよいですか?私はもともとその利益のために取り除いています。

+0

ルック:新しいshape続い

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

resizeは、第1の軸に沿ってサイズを小さくしているようです。 resize' – 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はまだ存在しますが、名前でアクセスすることはできません。データバッファはそれの半分を解放し、サイズが変更されたことが表示されますresize方法で

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 

。しかし、私はそれをテストする良い方法があるとは思っていません。少なくとも、このような小さな配列の場合はそうではありません。

潜在的に私たちは、numpy、pythonインタープリタ、およびシステムを管理する3つのシステムを持っています。 resizeの後にメモリが何らかの種類のnumpyキャッシュに追加されているのか、Pythonのガベージコレクタによって収集されたのか、システムに返されたのかどうかを調べるために、コード(おそらくC-api) 。 NP `のためのドキュメントで

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

第1軸である限り、 'resize'の後ろにインプレース' reshape'が続くように見えます。 – hpaulj

関連する問題