3

再配列をコピーして、新しい配列のフィールド/レコードの名前を変更しようとしています。ただし、これにより元の配列の名前が変更されます (ただし、値はリンク解除されません)。例:

import numpy as np
import copy

元の配列を定義する

arr = np.array(np.random.random((3,2)),
               dtype=[('a','float'),('b','float')])

最初のコピー

arr2 = arr.copy()
arr2.dtype.names = ('c','d')
arr.dtype.names
--> ('c','d')

2 番目のコピー

arr3 = copy.deepcopy(arr2)
arr2.dtype.names = ('e','f')
arr.dtype.names
--> ('e','f')

なぜこれが起こるのか、そしてこれを起こさないようにする方法は? dtypeは参照がコピーされる別のリスト/オブジェクトであると思われcopy()ますが、オブジェクトのディープコピーをdtype元の配列に割り当てても、同じ結果が得られます。

dt = copy.deepcopy(arr.dtype)
arr.dtype = dt

arr3.dtype.names = ('g','h')
arr.dtype.names
--> ('g','h')
4

1 に答える 1

1

元のdtypeに影響を与えずに変更できるように、arr3に独自のdtypeを持たせたいというQを解釈します。もしそうなら、あなたはすることができます

arr.dtype 
# --> dtype([('a', '<f8'), ('b', '<f8')])
dt3 = copy.deepcopy(arr.dtype)
dt3.names = ('g','h')
arr3 = np.array(arr, dtype=dt3)
arr.dtype 
# --> dtype([('a', '<f8'), ('b', '<f8')])

トリックは、arr3 を作成するときに異なる dtype を使用する必要があるようです (dt3 を変更してから arr3 を作成します)。それ以外の場合、ndarray は既存の dtype を取得します (これはある種のプロキシのようです)。

実際、私は以前に同様の問題を見つけずに苦労しました。そのとき、dtypeの一部を変更したかったのですが、方法がわからなかったので、この2番目のdtypeの定義全体を再度ハードワイヤードしました(私のフィールドの1つはサブ配列であり、実行時にのみその形状を知っています)。だから、これは私にとって良いQでした:)

于 2011-10-29T00:17:19.587 に答える