2011-08-12 2 views
9

Proste pytanie o NumPy:NumPy, nazwanych kolumn

załadować 100 wartości wektora a. Z tego wektora chcę utworzyć tablicę A z 2 kolumnami, gdzie jedna kolumna ma nazwę "C1", a druga "C2", jedna ma typ int32 i jedną . Przykład:

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
# A.dtype = ...? 

Jak zdefiniować rodzaje i nazwy kolumn, gdy tworzę tablicę z a?

+0

Najlepiej jest zawinąć tablicę (w rzeczywistości 2) i listę nazw do klasy kontenerów i użyć jej. – Keith

+0

@Keith: masz na myśli jakąś konkretną klasę (jestem nowy w numpy)? –

+0

Nie, mam na myśli to, co tworzysz. Następnie delegujesz operacje na tablice z metod zdefiniowanych w nowej klasie. Należy również zdefiniować metodę '__str__', aby ładnie drukować tablice z nagłówkami. – Keith

Odpowiedz

9

Numpy tablice strukturyzowane nazwali kolumny:

import numpy as np 

a=range(100) 
A = np.array(zip(*[iter(a)]*2),dtype=[('C1','int32'),('C2','int64')]) 
print(A.dtype) 
# [('C1', '<i4'), ('C2', '<i8')] 

można uzyskać dostęp do kolumn o nazwie tak:

print(A['C1']) 
# [ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 
# 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98] 

pamiętać, że korzystanie np.array z zip powoduje numpy zbudować tablicę z tymczasowym lista krotek. Listy krotek Pythona zużywają o wiele więcej pamięci niż równoważne tablice NumPy. Więc jeśli twoja macierz jest bardzo duża, możesz nie chcieć używać zip.

Zamiast tego, biorąc pod uwagę macierz NumPy A, można użyć ravel() aby A 1D tablicy, a następnie użyj view aby włączyć go do zorganizowanego tablicy, a następnie użyć astype przekonwertować kolumn do żądanego typu:

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
A = A.ravel().view([('col1','i8'),('col2','i8'),]).astype([('col1','i4'),('col2','i8'),]) 
print(A[:5]) 
# array([(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)], 
#  dtype=[('col1', '<i4'), ('col2', '<i8')]) 

print(A.dtype) 
# dtype([('col1', '<i4'), ('col2', '<i8')]) 
+0

Masz rację. http://docs.scipy.org/doc/numpy-1.4.x/reference/arrays.dtypes.html –

7

wiem, że to jest stare pytanie, ale od niedawna dostępną opcją byłoby spróbować użyć pandas. Typ DataFrame jest przeznaczony dla takich strukturalnych danych, w których kolumny są nazwane i mogą być różnych typów.