質問
私は2Dを持っています numpy
配列。最初の内容を含むビューを作成する方法はありますか? k
行とすべての列?
重要なのは、基礎となるデータのコピーを避けることです (配列が大きすぎるため、部分的なコピーを作成するのは現実的ではありません)。
解決
もちろん、通常どおりインデックスを作成するだけです。例えば。 y = x[:k, :]
これにより、ビューが元の配列に返されます。データはコピーされず、更新も行われません。 y
に反映されます x
およびその逆。
編集:
私は通常、uint8 の 10GB を超える 3D 配列を扱うので、これについては非常に心配しています...いくつかのことに留意すれば、Numpy はメモリ管理を非常に効率的に行うことができます。メモリ内に配列のコピーを作成しないようにするためのヒントをいくつか紹介します。
使用 +=
, -=
, *=
, 、などを使用して、配列のコピーの作成を回避します。例えば。 x += 10
配列をその場で変更しますが、 x = x + 10
コピーを作成して変更します。(こちらもご覧ください 数値式)
コピーを作成したい場合は、 x = x + 10
, 、 を注意 x = x + 10.0
引き起こします x
まだ浮動小数点配列にアップキャストされていない場合は、自動的に浮動小数点配列にアップキャストされます。しかし、 x += 10.0
, 、 どこ x
は整数配列であるため、 10.0
代わりに、配列と同じ精度の int にダウンキャストされます。
さらに、多くの 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 ビット浮動小数点として、 4607182418800017408
64 ビット int として表示される場合、および配列 [ 0, 0, 0, 0, 0, 0, 240, 63]
uint8 として見た場合。これは、大きな配列に対して何らかのビット操作を行う必要がある場合には非常に便利ですが...メモリ バッファの解釈方法を低レベルで制御できます。