numpy recarray复制保留dtype引用吗?

3

我正在尝试复制一个recarray,并在新数组中更改字段/记录的名称。但是,这会修改原始数组的名称(但值并未取消链接)。例如:

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

我理解你的问题是希望arr3拥有自己的数据类型,这样你就可以修改它而不影响原始数据类型。如果是这样,你可以

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的一部分,但不知道如何操作,所以我最终又为第二个dtype硬编码了整个定义(我的一个字段是子数组,我只在运行时知道其形状)。所以这对我来说是个好问题 :)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接