4

私は次のデータ構造を持っています:

N=100
TB =     {'names':('n', 'D'),'formats':(int, int)}
TA =     {'names':('id', 'B'),'formats':(int, dtype((TB, (N))))}
a = np.empty(1000, dtype=TA)
b = np.empty(N, dtype=TB)

ここで、a は「id」と「B」の 2 つのフィールドを持つ構造化配列です。「B」には、フィールド「n」と D を持つ別の構造化配列が格納されます。

for i in range(0,1000):
   a['B'][i] = b

上記の割り当てが実行されると、b のデータが a にコピーされます。b への参照だけをコピーして、b を変更すると変更が に反映されるようにする方法はありa['B'][i]ますか? 私が望むのは、b へのポインターを a に格納することです。これは、b のデータが a のすべての行で同一であるため、コピーを作成する必要がないためです。

疲れた

TA = {'names':('id', 'B'),'formats':(int, object)}

それは機能しますが、配列のネストされた構造を壊します。構造化された配列機能を保持する方法はありますか?a['B']['D']

ありがとう

4

2 に答える 2

4

簡単な答えはノーです。numpy配列の構文は標準のPython構文と同じように見えますが、舞台裏で行われていることは大きく異なります。のような複雑なnumpyデータ型TAは、連続するメモリの大きなブロックを使用して各レコードを格納します。メモリは定期的に配置する必要があります。そうしないと、すべてがバラバラになります。

したがって、のようなネストされたデータ型を使用して1000項目の配列を作成すると、実際には1000ブロックのメモリが割り当てられます。各ブロックは、個別の配列TAを含むのに十分な大きさです。だからこそ、次のようなことができるのです。つまり、ポイントを示すと、次のようなことができます。NTBa['B']['D']

>>> (a['B'][1]['D'] == a['B']['D'][1]).all()
True
>>> a['B'][1]['D'][0] = 123456789
>>> (a['B'][1]['D'] == a['B']['D'][1]).all()
True

通常のPythonオブジェクトの場合、オブジェクトアイテムのアクセス順序が重要であるため、上記は失敗します。これがで可能であるのは実際には非常に奇妙でnumpyあり、それが可能な唯一の理由は、numpy均一に構造化された連続したメモリを使用することです。

私の知る限り、numpyあなたが求めていることを実行する方法は提供されていません(私が間違っている場合は誰かが私を訂正します!)。必要な間接参照には、おそらくnumpyのAPIへの大幅な変更が含まれます。

とにかくこれを行うことはあまり意味がないと思うことを付け加えておきます。配列のコピーが1つだけ必要な場合は、配列の外に保存してみませんか?tupleまたはの一部として、numpy配列と一緒に渡すこともできnamedtupleます。

于 2012-08-09T15:14:37.493 に答える
0

はい、ビューを開くだけです。しかし、あなたが説明したように、それは逆に機能します:

>>> a = np.array([1,2,3,4,5,6])
>>> b = a[2:4].view()
>>> b[0] = 0
>>> b[1] = 0
>>> a
array([1, 2, 0, 0, 5, 6])
于 2012-08-10T01:41:22.170 に答える