web-dev-qa-db-ja.com

numpy配列を見る?

2D numpy配列があります。最初のk行とすべての列を含むビューを作成する方法はありますか?

重要なのは、基礎となるデータのコピーを避けることです(配列は非常に大きいため、部分的なコピーを作成することはできません)。

86
NPE

もちろん、通常どおりインデックスを作成します。例えば。 _y = x[:k, :]_これは、元の配列にビューを返します。データはコピーされず、yに加えられた更新はxに反映され、その逆も同様です。


編集:

私は通常、10GBを超えるuint8の3Dアレイで作業するので、これについて多くのことを心配しています...いくつかのことを念頭に置いておくと、Numpyはメモリ管理で非常に効率的です。メモリ内に配列のコピーを作成しないようにするためのいくつかのヒントを次に示します。

_+=_、_-=_、_*=_などを使用して、配列のコピーを作成しないようにします。例えば。 _x += 10_はその場で配列を変更しますが、_x = x + 10_はコピーを作成して変更します。 (また、 numexpr をご覧ください)

_x = x + 10_を使用してコピーを作成する場合、_x = x + 10.0_を使用すると、xが自動的に浮動小数点配列にアップキャストされます(まだない場合)。ただし、xが整数配列である_x += 10.0_は、代わりに_10.0_を配列と同じ精度のintにダウンキャストします。

さらに、多くのnumpy関数はoutパラメーターを受け取るため、np.abs(x, x)などの操作を行ってxの絶対値をインプレースで取得できます。


2番目の編集として、viewsvs.copiesのヒントをいくつか紹介します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は配列の基になるbitsをintとして解釈します。

たとえば、これは、リトルエンディアンシステム上の64ビット浮動小数点としての_1.0_が、64ビットintとして表示される場合は_4607182418800017408_になり、uint8として表示される場合は_[ 0, 0, 0, 0, 0, 0, 240, 63]_の配列になることを意味します。ただし、大きな配列で何らかのビットのいじりを行う必要がある場合、これは本当に素晴らしいことです...メモリバッファの解釈方法を低レベルで制御できます。

214
Joe Kington