Копия NumPy Recarray сохраняет ссылку dtype?
Я пытаюсь скопировать повторный массив и изменить имена полей / записей в новом массиве. Однако это изменяет имена исходного массива (однако значения не являются несвязанными). Пример:
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 ответ
Я понимаю, что для вашего 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 (одно мое поле было вложенным массивом, и я знаю его форму только во время выполнения). Так что это был хороший вопрос для меня:)