2D numpy
配列があります。最初のk
行とすべての列を含むビューを作成する方法はありますか?
重要なのは、基になるデータのコピーを回避することです(配列が大きすぎるため、部分的なコピーを作成することはできません)。
回答:
もちろん、通常どおりにインデックスを作成してください。たとえば、y = x[:k, :]
これはビューを元の配列に戻します。データはコピーされず、加えられた更新はy
反映されx
、その逆も同様です。
編集:
私は通常、uint8の10GBを超える3D配列で作業するので、これについては非常に心配しています...いくつかのことを覚えておくと、Numpyはメモリ管理で非常に効率的です。メモリ内に配列のコピーを作成しないようにするためのいくつかのヒントを次に示します。
使用+=
、-=
、*=
、などの配列のコピーを作成することを避けるために。たとえば、コピーを作成してそれを変更しx += 10
ながら、アレイを所定の位置にx = x + 10
変更します。(また、numexprを見てください)
あなたがコピーを作成したい場合はx = x + 10
、その意識するx = x + 10.0
原因になりますx
がまだなかった場合、自動的に浮動小数点アレイにアップキャストされます。しかし、x += 10.0
ここで、x
整数配列であり、原因となる10.0
代わりに、アレイと同じ精度のINTにダウンキャストします。
さらに、多くのnumpy関数はout
パラメーターnp.abs(x, x)
を取るため、x
インプレースの絶対値を取得するなどのことができます。
第二編集として、ここにいくつかのより多くのヒントだ景色対コピー 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として表示される場合の配列になることを意味します。これは、大きな配列でビットソートを行う必要がある場合に非常に便利ですが、メモリバッファーの解釈方法を低レベルで制御できます。
b
ビューの場合a
、その後にb.base is a
なりますTrue
。(任意の配列の)コピーは常に持っていますarr_copy.base is None
x[np.array([1, 1, 3, 1])] += 1
変更されたかを混乱させましたx
。今それを手に入れました!