2013-04-26 18 views
9

Sagen wir, ich definieren eine Rekord-ArrayHinzufügen von Datensätzen zu einer numpy Rekord Array

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

und dann gehe ich die 4 Aufzeichnungen zur Verfügung zu füllen. Jetzt bekomme ich mehr Daten, so etwas wie

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

und ich will diesen Rekord zu y hinzuzufügen. Ich kann keinen sauberen Weg finden, es zu tun. Das Beste, was ich in np.concatenate() gesehen habe, aber das würde erfordern, c in ein Record-Array in und von sich selbst zu drehen. Gibt es eine einfache Möglichkeit, mein Tupel c auf y zu heften? Dies scheint so zu sein, dass es wirklich unkompliziert und umfassend dokumentiert sein sollte. Entschuldigung, wenn es ist. Ich konnte es nicht finden.

Antwort

19

Sie können numpy.append() verwenden, aber wie Sie die neuen Daten in einem Datensatz-Array konvertieren müssen auch:

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)) 

Da ndarray kann nicht dynamisch ändern es Größe ist, müssen Sie alle Daten kopieren, wenn Sie Ich möchte einige neue Daten anhängen. Sie können eine Klasse erstellen, die die Größenänderungsfrequenz reduziert:

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

Wow! Danke für den Code! –

4

Dies liegt daran, dass die Verkettung von numpy Arrays normalerweise vermieden wird, da es die Neuzuweisung von zusammenhängendem Speicherplatz erfordert. Größe Ihres Arrays mit Platz zu sparen, und dann in großen Blöcken bei Bedarf verketten. This post kann eine Hilfe sein.

+0

Danke. Ich verstehe jetzt. Ich bin überrascht, aber ich verstehe. –

Verwandte Themen