2Dnumpy
アレイがあります。k
最初の行とすべての列を含むビューを作成する方法はありますか?
重要なのは、基になるデータのコピーを回避することです(配列が非常に大きいため、部分的なコピーを作成することはできません)。
もちろん、通常どおりにインデックスを作成します。たとえばy = x[:k, :]
、これは元の配列にビューを返します。データはコピーされず、行われた更新はy
反映されx
、その逆も同様です。
編集:
私は通常、uint8の10GBを超える3Dアレイを使用しているので、これについては非常に心配しています...いくつかのことを念頭に置いておくと、Numpyはメモリ管理で非常に効率的です。メモリ内に配列のコピーを作成しないようにするためのヒントを次に示します。
+=
、、、などを使用して-=
、*=
配列のコピーを作成しないようにします。たとえばx += 10
、アレイを所定の位置でx = x + 10
変更し、コピーを作成して変更します。(また、numexprを見てください)
を使用してコピーを作成する場合は、浮動小数点配列に自動的にアップキャストされることに注意してください(まだアップキャストされていない場合)x = x + 10
。ただし、は整数配列である場合、代わりに、を配列と同じ精度のintにダウンキャストします。 x = x + 10.0
x
x += 10.0
x
10.0
さらに、多くのnumpy関数はパラメーターを受け取るため、インプレースの絶対値を取得するout
などの操作を実行できます。np.abs(x, x)
x
2番目の編集として、ビューとnumpy配列を使用したコピーに関するヒントをいくつか示します。
Pythonリストとは異なりy = x[:]
、コピーを返すのではなく、ビューを返します。コピーが必要な場合(もちろん、使用しているメモリの量が2倍になります)y = x.copy()
numpy配列の「ファンシーインデックス」についてよく耳にします。リスト(または整数配列)をインデックスとして使用することは、「ファンシーインデックス」です。これは非常に便利ですが、データをコピーします。
この例としてy = x[[0, 1, 2], :]
、コピーを返しますがy = x[:3,:]
、ビューを返します。
「通常の」インデックス作成のような本当にクレイジーなインデックス作成でさえx[4:100:5, :-10:-1, None]
、ビューを返すので、大きな配列であらゆる種類のスライストリックを使用することを恐れないでください。
x.astype(<dtype>)
データのコピーを新しいタイプとしてx.view(<dtype>)
返し、ビューを返します。
ただし、これには注意してください...これは非常に強力で便利ですが、基になるデータがメモリにどのように格納されるかを理解する必要があります。floatの配列があり、それらをintとして表示する場合(またはその逆の場合)、numpyは配列の基になるビットをintとして解釈します。
たとえば、これは、1.0
リトルエンディアンシステムで64ビットfloat4607182418800017408
として、64ビットintとして表示された場合、および[ 0, 0, 0, 0, 0, 0, 240, 63]
uint8として表示された場合の配列になることを意味します。これは、大きな配列である種のビットをいじる必要がある場合に非常に便利ですが、メモリバッファの解釈方法を低レベルで制御できます。