web-dev-qa-db-ja.com

ゴツゴツした形を整える

Numpy配列の形状を変更する方法はありますが、インプレースです。私の問題は、配列が非常に大きいため、不要なコピーがメモリに負担をかけないことです。

私の現在のアプローチは次のようなものです。

train_x = train_x.reshape(n,32*32*3)

これは、新しい配列を作成してから、ラベルtrain_xを新しい配列に割り当てるため、問題を正確に解決するわけではありません。

ガベージコレクターはすぐに元の配列を収集するため、通常の場合、これは問題ありません。

問題は私がこのようなものを持っているということです:

train_x, train_y = train_set
train_x = train_x.reshape(n,32*32*3)

したがって、この場合、train_xが元の配列を指していなくても、train_set内に元の配列へのポインターがあります。

前の配列のすべてのポインターをこの新しい配列に変更する方法が必要です。方法はありますか?

または多分これに対処する他の方法があります/

7

Pythonの場合、複数の変数または名前がnumpy配列などの同じオブジェクトを指す可能性があることに注意してください。配列には、新しい配列オブジェクトであるが共有データバッファーを持つビューを含めることもできます。コピーには独自のデータバッファがあります。

In [438]: x = np.arange(12)
In [439]: y = x                # same object
In [440]: y.shape = (2,6)      # inplace shape change
In [441]: y
Out[441]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [442]: x
Out[442]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])
In [443]: y = y.reshape(3,4)        # y is a new view
In [444]: y
Out[444]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
In [445]: x
Out[445]: 
array([[ 0,  1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10, 11]])

yの形状は異なりますが、データバッファを共有します。

In [446]: y += 1
In [447]: y
Out[447]: 
array([[ 1,  2,  3,  4],
       [ 5,  6,  7,  8],
       [ 9, 10, 11, 12]])
In [448]: x
Out[448]: 
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])
13
hpaulj