1

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

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

复制 RAM 的解决方案:

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

4

1 回答 1

3

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

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

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

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

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

于 2016-10-10T20:56:26.040 回答