2015-01-17 11 views
9

Co, jeśli w ogóle, stanowi różnicę między "tablicą strukturalną" NumPy, "tablicą rekordów" i "rekaracją"?NumPy "tablica rekordów" lub "tablica strukturalna" lub "rekaracja"

The NumPy docs oznacza, że ​​pierwsze dwa są takie same: jeśli są, który jest preferowanym terminem dla tego obiektu?

Ta sama dokumentacja mówi (na dole strony): Możesz znaleźć więcej informacji na temat rekursorów i strukturowanych tablic (w tym różnicę między nimi) here. Czy istnieje proste wyjaśnienie tej różnicy?

+0

[Strukturowe tablice (inaczej "Tablice rekordów")] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) –

+0

Wyjaśniłem pytanie, @Ashwini Chaudhary - dziękuję . – xnx

+0

Co jest niejasne w wyjaśnieniu różnicy na dokumentach? recarray obsługuje dostęp do pól w postaci 'arr.foo', podczas gdy normalne struktury tablicowe obsługują dostęp tylko za pomocą formatu' arr ['foo'] ', ale jest szybszy do wyszukiwania. Nigdy nie nazwałbym "tablicami strukturalnymi" "tablicami rekordów", właśnie dlatego, że powoduje to tyle potencjalnego pomylenia z "rekursami". – zehnpaard

Odpowiedz

7

Records/recarrays są realizowane w

https://github.com/numpy/numpy/blob/master/numpy/core/records.py

Niektóre odpowiednie cytaty z tego pliku

Record Tablice Tablice Record odsłonięcia pola strukturyzowanych tablic jak właściwości. Recarray jest prawie identyczny z standardową tablicą (która obsługuje już wymienione zmienne ). Największą różnicą jest to, że można użyć atrybutu-odnośnika o nazwie , aby znaleźć pola i jest on tworzony przy użyciu rekordu o wartości .

recarray to podklasa ndarray (w taki sam sposób, matrix i masked arrays ARE). Ale zauważ, że jego konstruktor różni się od np.array. Jest bardziej podobny do np.empty(size, dtype).

class recarray(ndarray): 
    """Construct an ndarray that allows field access using attributes. 
    This constructor can be compared to ``empty``: it creates a new record 
     array but does not fill it with data. 

Przycisk funkcyjny za wdrożenie unikalnego boiska zachowania atrybutu jest __getattribute__ (__getitem__ realizuje indeksowanie):

def __getattribute__(self, attr): 
    # See if ndarray has this attr, and return it if so. (note that this 
    # means a field with the same name as an ndarray attr cannot be 
    # accessed by attribute). 
    try: 
     return object.__getattribute__(self, attr) 
    except AttributeError: # attr must be a fieldname 
     pass 

    # look for a field with this name 
    fielddict = ndarray.__getattribute__(self, 'dtype').fields 
    try: 
     res = fielddict[attr][:2] 
    except (TypeError, KeyError): 
     raise AttributeError("recarray has no attribute %s" % attr) 
    obj = self.getfield(*res) 

    # At this point obj will always be a recarray, since (see 
    # PyArray_GetField) the type of obj is inherited. Next, if obj.dtype is 
    # non-structured, convert it to an ndarray. If obj is structured leave 
    # it as a recarray, but make sure to convert to the same dtype.type (eg 
    # to preserve numpy.record type if present), since nested structured 
    # fields do not inherit type. 
    if obj.dtype.fields: 
     return obj.view(dtype=(self.dtype.type, obj.dtype.fields)) 
    else: 
     return obj.view(ndarray) 

Najpierw próbuje dostać regularną atrybut - rzeczy jak .shape, .strides, .data , a także wszystkie metody (.sum, .reshape itd.). W przeciwnym razie wyszukuje nazwę w nazwach pól dtype. Tak naprawdę jest to tylko uporządkowana tablica z pewnymi zdefiniowanymi na nowo metodami dostępu.

Jak najlepiej mogę powiedzieć, że record array i recarray są takie same.

Kolejny plik pokazuje coś o historii

https://github.com/numpy/numpy/blob/master/numpy/lib/recfunctions.py

kolekcję narzędzi do manipulowania tablice strukturyzowane. Większość z tych funkcji została początkowo zaimplementowana przez Johna Huntera na matplotlib. Zostały one przepisane i rozszerzone dla wygody.

Wiele funkcji w tym pliku kończy się:

if asrecarray: 
     output = output.view(recarray) 

Fakt, że można zwracać tablicę jako recarray widok pokazuje, jak „cienka” warstwa ta jest.

numpy ma długą historię i łączy kilka niezależnych projektów. Mam wrażenie, że recarray jest starszym pomysłem, a struktura zawiera bieżącą implementację opartą na uogólnionym dtype. recarrays wydaje się być przechowywana dla wygody i kompatybilności wstecznej niż jakakolwiek nowa wersja. Ale muszę się zapoznać z historią plików github i wszelkimi ostatnimi problemami/żądaniami pobierania, aby mieć pewność.