2013-04-26 64 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