向结构化 ndarray 添加字段的内存友好方式——无需复制数据?

Memory-friendly way to add a field to a structured ndarray — without duplicating data?

要向结构化 numpy 数组添加字段,只需创建一个具有新 dtype 的新数组,复制旧字段,然后添加新字段即可。但是,我需要为占用大量内存的数组执行此操作,而且我不想复制所有内容。我自己的实现和 numpy.lib.recfunctions.append_fields 重复内存中的(慢)实现。

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

重复 RAM 的解决方案:

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

结构化数组与常规数组一样,存储为连续的字节缓冲区,一条记录接在前一条记录之后。因此,记录有点像多维数组的最后一维。如果不通过串联创建新数组,则无法将列添加到二维数组。

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

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

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

也许您应该使用字典,item 是一个数组。然后你可以随意添加一个 key/item 而无需复制现有的。但是 'rows' 访问会很慢。