将记录添加到 numpy 记录数组

Posted

技术标签:

【中文标题】将记录添加到 numpy 记录数组【英文标题】:Adding records to a numpy record array 【发布时间】:2013-04-21 05:31:27 【问题描述】:

假设我定义了一个记录数组

>>> y=np.zeros(4,dtype=('a4,int32,float64'))

然后我继续填写可用的 4 条记录。现在我得到了更多的数据,比如

>>> c=('a',7,'24.5')

我想将此记录添加到y。我想不出一个干净的方法来做到这一点。我在np.concatenate() 中看到的最好的,但这需要将c 本身变成一个记录数组。有什么简单的方法可以将我的元组c 添加到y 上?这似乎应该非常简单并且被广泛记录。如果是,请道歉。我没找到。

【问题讨论】:

【参考方案1】:

您可以使用numpy.append(),但您还需要将新数据转换为记录数组:

import numpy as np
y = np.zeros(4,dtype=('a4,int32,float64'))
y = np.append(y, np.array([("0",7,24.5)], dtype=y.dtype))

由于 ndarray 不能动态改变它的大小,当你想追加一些新数据时,你需要复制所有的数据。您可以创建一个减少调整大小频率的类:

import numpy as np

class DynamicRecArray(object):
    def __init__(self, dtype):
        self.dtype = np.dtype(dtype)
        self.length = 0
        self.size = 10
        self._data = np.empty(self.size, dtype=self.dtype)

    def __len__(self):
        return self.length

    def append(self, rec):
        if self.length == self.size:
            self.size = int(1.5*self.size)
            self._data = np.resize(self._data, self.size)
        self._data[self.length] = rec
        self.length += 1

    def extend(self, recs):
        for rec in recs:
            self.append(rec)

    @property
    def data(self):
        return self._data[:self.length]

y = DynamicRecArray(('a4,int32,float64'))
y.extend([("xyz", 12, 3.2), ("abc", 100, 0.2)])
y.append(("123", 1000, 0))
print y.data
for i in xrange(100):
    y.append((str(i), i, i+0.1))

【讨论】:

【参考方案2】:

这是因为通常避免连接 numpy 数组,因为它需要重新分配连续的内存空间。调整阵列的大小并留出空间,然后在需要时以大块连接。 This post 可能会有所帮助。

【讨论】:

谢谢。我现在知道了。我很惊讶,但我理解。

以上是关于将记录添加到 numpy 记录数组的主要内容,如果未能解决你的问题,请参考以下文章

将项目添加到数组(状态)并且它正在更新状态中的先前记录

如何将 Numpy 数组添加到字典中

如何将 % 添加到 numpy 数组中的每个值?

将一维 Numpy 数组作为行添加到 DataFrame

通过唯一整数将 numpy 数组值作为列添加到 DataFrame

Numpy - 将行添加到数组