2013-04-26 66 views
9

比方说,我定义了一个记录阵列添加记录到numpy的记录阵列

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

,然后我继续填补了4条可用。现在,我得到更多的数据,像

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

,我想这个记录添加到y。我找不出一个干净的方式来做到这一点。我在np.concatenate()中看到的最好的,但是这需要将c变成一个记录数组本身。有没有简单的方法来解决我的元组到y?这似乎应该是非常简单和广泛记录。道歉,如果是的话。我一直无法找到它。

回答

19

您可以使用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)) 
+0

哇!感谢代码! – 2013-04-29 15:30:52

4

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

+0

谢谢。我现在知道了。我很惊讶,但我明白。 – 2013-04-29 15:28:29