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

Другие вопросы по тегам