numpy recarray copy保留dtype参考?

时间:2011-10-28 22:56:56

标签: numpy scipy 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 个答案:

答案 0 :(得分:1)

我想知道你想让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')])

当我创建arr3(更改dt3,然后创建arr3)时,似乎我必须有不同的dtype。否则,ndarray抓住预先存在的dtype(这似乎是某种代理)。

实际上我在没有找到它的情况下更早地遇到了类似的问题。我想要修改dtype的一部分然后,但是我不知道如何为第二个dtype再次硬连接整个定义(我的一个字段是子数组,我只知道它的形状在运行时)。所以这对我来说是个好Q:)