копия NumPy Recarray сохраняет ссылку dtype? - PullRequest
3 голосов
/ 29 октября 2011

Я пытаюсь скопировать повторный массив и изменить имена полей / записей в новом массиве.Однако это изменяет имена исходного массива (однако значения не являются несвязанными).Пример:

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')

вторая копия

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')

1 Ответ

1 голос
/ 29 октября 2011

Я понимаю, что для вашего Q вы хотите, чтобы arr3 имел собственный dtype, чтобы вы могли изменить его, не затрагивая dtype исходного.если это так, вы можете

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')])

Прикол, кажется, у меня должен быть другой тип dtype при создании arr3 (изменил dt3, а затем создал arr3).в противном случае, ndarray захватывает ранее существовавший dtype (кажется, что-то вроде прокси).

На самом деле я боролся с подобной проблемой ранее, не найдя ее.Я хотел изменить часть dtype тогда, но не знал, как, поэтому я снова закончил жестко полное определение для этого второго dtype (одно мое поле было вложенным массивом, и я знаю его форму только во время выполнения).Так что это был хороший вопрос для меня:)

...