向numpy记录数组中添加记录

14

假设我定义一个记录数组

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

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

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

我想将这个记录添加到y中,但我无法找到一种简洁的方法。目前最好的方式是使用np.concatenate(),但这需要将c本身转换为一个记录数组。是否有任何简单的方法将我的元组c附加到y上?这似乎应该是非常简单和广泛记录的。如果是这样的话,很抱歉我没有找到它。

2个回答

26

你可以使用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))

6
这是因为连接numpy数组通常被避免,因为它需要重新分配连续的内存空间。请留出足够的空间来定义您的数组,如果需要,则按大块连接。 这篇文章可能会有所帮助。

谢谢。我现在明白了。我很惊讶,但我理解了。 - bob.sacamento

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接