1. ホーム
  2. python

[解決済み] numpyの配列に表示する?

2022-11-08 05:22:26

質問

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

ポイントは、基礎となるデータをコピーしないことです(配列は非常に大きいので、部分的なコピーをすることは実行不可能です)。

どのように解決するのですか?

もちろん、通常と同じようにインデックスを作成してください。 例えば y = x[:k, :] これは、元の配列へのビューを返します。データはコピーされません。 y に反映されます。 x に反映され、逆もまた然りです。


編集してください。

私はよく>10GBのuint8の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 をその場で取る。


2回目の編集として、以下は ビュー との比較です。 コピー をnumpyの配列と比較します。

pythonのリストとは異なり y = x[:] はコピーを返さず、ビューを返します。もしコピーを取りたいのであれば、(もちろん、使用するメモリ量が倍増します) y = x.copy()

numpy配列のquot;fancy indexing"についてよく耳にすると思います。インデックスとしてリスト(または整数配列)を使用することは、"fancy indexing"です。これは非常に便利ですが、データをコピーしてしまいます。

この例として y = x[[0, 1, 2], :] はコピーを返しますが y = x[:3,:] はビューを返します。

のような本当におかしなインデックス付けでも x[4:100:5, :-10:-1, None] のような本当におかしなインデックスでも、quot;normal" インデックスであり、ビューを返すので、大きな配列であらゆる種類のスライシングトリックを使うことを恐れないでください。

x.astype(<dtype>) はデータのコピーを新しい型として返します。 x.view(<dtype>) はビューを返します。

ただし、これには注意が必要です...。これは非常に強力で便利ですが、基礎となるデータがどのようにメモリに格納されているかを理解する必要があります。 浮動小数点数の配列を持っていて、それをint型として表示する場合(またはその逆)、numpyはその基礎にある ビット をint型として解釈します。

例えば、これは 1.0 をリトルエンディアンのシステムで 64bit の float として使用すると 4607182418800017408 となり、64ビットintとして見た場合は [ 0, 0, 0, 0, 0, 0, 240, 63] の配列となります。 これは、大きな配列に対してある種のビット操作を行う必要がある場合に非常に有効ですが... メモリバッファがどのように解釈されるかを低レベルで制御することができます。