Python 向结构化数据阵列添加字段的内存友好方式—;不复制数据?

Python 向结构化数据阵列添加字段的内存友好方式—;不复制数据?,python,arrays,numpy,memory,structured-array,Python,Arrays,Numpy,Memory,Structured Array,要将字段添加到结构化numpy数组,只需使用新的数据类型创建一个新数组,复制旧字段,然后添加新字段。但是,我需要对占用大量内存的数组执行此操作,我不希望复制所有数组。我自己的实现和numpy.lib.recfunctions.append\u字段中的(慢)实现都是重复内存 有没有一种方法可以在不复制内存的情况下将字段添加到结构化的ndarray?这意味着,要么避免创建新的ndarray,要么创建指向旧数据的新ndarray 不复制RAM的解决方案: 有一个挑战是删除而不是添加字段。该解

要将字段添加到结构化numpy数组,只需使用新的数据类型创建一个新数组,复制旧字段,然后添加新字段。但是,我需要对占用大量内存的数组执行此操作,我不希望复制所有数组。我自己的实现和
numpy.lib.recfunctions.append\u字段中的(慢)实现都是重复内存

有没有一种方法可以在不复制内存的情况下将字段添加到结构化的
ndarray
?这意味着,要么避免创建新的
ndarray
,要么创建指向旧数据的新
ndarray

不复制RAM的解决方案:


有一个挑战是删除而不是添加字段。该解决方案使用一个视图,该视图应该适用于原始数据的一个子集,但我不确定当我更想添加字段时是否可以对其进行修改。

结构化数组像常规数组一样存储为字节的连续缓冲区,前一个记录后有一个记录。因此,这些记录有点像多维数组的最后一个维度。如果不通过连接生成新数组,则无法将列添加到二维数组中

将一个字段(比如说
I4
dtype)添加到dtype,即20字节长,意味着将记录(元素)长度更改为24,即每20个字节向缓冲区添加4个字节
numpy
如果不创建一个新的数据缓冲区并从旧的(和新的)数据中复制值,就无法做到这一点

实际上,即使我们正在讨论向数组添加一个新记录,即在一个新数组上连接,它仍然需要创建一个新的数据缓冲区。阵列的大小是固定的

结构化数组中的字段与列表或字典中的对象不同。不能仅通过添加指向内存中其他位置对象的指针来添加字段


也许你应该使用字典,
item
是一个数组。然后,您可以自由添加键/项,而无需复制现有的键/项。但是“行”的访问速度会很慢。

Hmm,好的。我需要一个不同的方法。也许我可以将大数组分成N个部分,一次向较小的部分添加一个字段,这样我仍然可以复制所有内容,但不能一次复制所有内容,从而限制峰值内存使用量。但是,应该可以以内存友好的方式进行,而不必复制数据。它可以将数据复制到新阵列并增加新阵列大小,同时减少旧阵列大小。每个“增加”和“减少”都需要数据副本。不要担心“内存友好型”的问题,除非它真的会影响执行时间或者你会遇到“内存错误”问题。但不要将这两个问题混为一谈。如果数组是缓冲区上的视图,而缓冲区的后半部分没有使用,则可以在后半部分分配额外字段(而不是与其现有行相邻)。