2013-04-26 11 views
9

powiedzmy zdefiniować tablicy rekorddodawania rekordów do tablicy rekord numpy

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

a potem postępować, aby wypełnić 4 rekordy dostępny. Teraz mam więcej danych, coś

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

i chcę dodać ten rekord do y. Nie potrafię tego zrobić w czysty sposób. Najlepsze, jakie widziałem w np.concatenate(), ale wymagałoby to przekształcenia c w macierz rekordów sama w siebie. Czy istnieje jakiś prosty sposób na przylepienie mojej krotki c do y? Wydaje się, że powinno to być naprawdę proste i szeroko udokumentowane. Przepraszam, jeśli tak jest. Nie byłem w stanie go znaleźć.

Odpowiedz

19

Można użyć numpy.append(), ale jak trzeba konwertować nowe dane do tablicy rejestrują także:

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

Od ndarray nie może dynamiczna zmiana jego rozmiaru, należy skopiować wszystkie dane, kiedy chcesz dołączyć nowe dane. Możesz utworzyć klasę, która zmniejsza częstotliwość zmiany rozmiaru:

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! Dzięki za kod! –

4

Jest tak, ponieważ zazwyczaj unika się łączenia numpy tablic, ponieważ wymaga realokacji sąsiedniej przestrzeni pamięci. Rozmieść swoją tablicę z pokojem do stracenia, a następnie w razie potrzeby połączyć w duże kawałki. This post może być pomocne.

+0

Dzięki. Teraz rozumiem. Jestem zaskoczony, ale rozumiem. –