numpy recarray 副本保留 dtype 引用?

标签 numpy scipy recarray

我正在尝试复制一个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')

最佳答案

我将您的 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')])

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

其实我之前也遇到过类似的问题,但没有找到。然后我想修改 dtype 的一部分,但不知道如何最终为第二个 dtype 再次硬连线整个定义(我的一个字段是子数组,我只在运行时知道它的形状)。所以这对我来说是个好问题:)

关于numpy recarray 副本保留 dtype 引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7935707/

相关文章:

python - 使用二维数组索引一维 Numpy 数组

python:将两列nd数组相乘以获得相同维度的向量?

python - Numpy/Scipy 如何将 C 函数转换为向量化的 Python 函数?

Python Numpy recarray 排序双向

python - 以特定方式多次连接两个矩阵

python - Pandas/numpy 加权平均 ZeroDivisionError

python - 大型稀疏线性系统求解,重新排序和预处理器会变得更糟吗?

python - 函数引用在循环外丢失

python - 获取 recarray 属性/列 python

python - 子类空 numpy recarray 丢失其类型并在 numpy 1.8 中添加属性