1

構造化された numpy 配列にフィールドを追加するには、新しい dtype で新しい配列を作成し、古いフィールドをコピーして、新しいフィールドを追加するだけです。ただし、多くのメモリを必要とする配列に対してこれを行う必要があり、すべてを複製したくありません。私自身の実装と、numpy.lib.recfunctions.append_fields重複したメモリでの(遅い)実装の両方。

ndarrayメモリを複製せずに、構造化された にフィールドを追加する方法はありますか? つまり、 newndarrayの作成を回避する方法ndarray、古いものと同じデータを指す新しい を作成する方法のどちらか?

RAM を複製するソリューション:

フィールドを追加するのではなく、削除することが課題である同様の質問があります。このソリューションでは、元のデータのサブセットに対して機能するはずのビューを使用していますが、フィールドを追加したいときに修正できるかどうかはわかりません。

4

1 に答える 1

3

構造化配列は、通常の配列と同様に、連続するバイトのバッファとして格納され、前のレコードに続く 1 つのレコードが格納されます。したがって、レコードは多次元配列の最後の次元に少し似ています。連結によって新しい配列を作成せずに、2 次元配列に列を追加することはできません。

たとえば 20 バイトの長さの dtype に dtypeというフィールドを追加するI4と、レコード (要素) の長さが 24 に変更されます。つまり、20 バイトごとに 4 バイトがバッファに追加されます。 numpy新しいデータ バッファーを作成し、古い (および新しい) から値をコピーしない限り、これを行うことはできません。

実際には、配列に新しいレコードを追加する、つまり新しい配列に連結することについて話している場合でも、新しいデータ バッファーを作成する必要があります。配列は固定サイズです。

構造化配列のフィールドは、リストや辞書のオブジェクトとは異なります。メモリ内の別の場所にあるオブジェクトへのポインタを追加するだけでは、フィールドを追加できません。

itemたぶん、配列である辞書を使用する必要があります。その後、既存のものをコピーすることなく、キー/アイテムを自由に追加できます。ただし、「行」によるアクセスは遅くなります。

于 2016-10-10T20:56:26.040 に答える