2015-01-17 6 views
9

Was ist, wenn überhaupt, der Unterschied zwischen einem NumPy "strukturierten Array", einem "Record Array" und einem "Recarray"?NumPy "record array" oder "structured array" oder "recarray"

Die NumPy docs implizieren, dass die ersten beiden gleich sind: wenn sie sind, was ist der bevorzugte Begriff für dieses Objekt?

Die gleiche Dokumentation sagt (unten auf der Seite): Sie können einige weitere Informationen über recarrays und strukturierte Arrays (einschließlich der Differenz zwischen den beiden) here finden. Gibt es eine einfache Erklärung für diesen Unterschied?

+0

[Strukturierte Arrays (auch bekannt als "Record Arrays")] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) –

+0

Ich habe die Frage geklärt, @Ashwini Chaudhary - danke . – xnx

+0

Was ist unklar an der Erklärung des Unterschieds in den Dokumenten? recarray unterstützt den Zugriff auf Felder in 'arr.foo' Form, während normal strukturierte Arrays den Zugriff nur über' arr ['foo'] 'Format unterstützen, aber schneller nachschlagen können. Ich würde niemals "strukturierte Arrays" "Record Arrays" nennen, gerade weil es so viel potentielle Verwirrung mit "Recarrays" verursacht. – zehnpaard

Antwort

7

Records/recarrays sind in

implementiert

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

Einige relevante Zitate aus dieser Datei

Nehmen Arrays Arrays Nehmen Sie die Felder von strukturierten Arrays als Eigenschaften aus. Das Neuarray ist fast identisch mit einem Standardarray (das benannte Felder bereits unterstützt) Der größte Unterschied ist, dass es Attributsuche verwenden kann, um die Felder zu finden, und es wird unter Verwendung eines Datensatzes erstellt.

recarray ist eine Unterklasse von ndarray (in der gleichen Art und Weise, dass matrix und masked arrays sind). Beachten Sie jedoch, dass der Konstruktor sich von np.array unterscheidet. Es ist mehr wie 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. 

Die Schlüsselfunktion für das eindeutige Feld als Attribut Verhalten Umsetzung __getattribute__ ist (__getitem__ implementiert Indizierung):

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) 

Es versucht es zuerst ein reguläres Attribut zu bekommen - Dinge wie .shape, .strides, .data sowie alle Methoden (.sum, .reshape, usw.). Bei fehlgeschlagener Suche wird dann der Name in den Feldnamen dtype nachgeschlagen. Es ist also wirklich nur ein strukturiertes Array mit einigen neu definierten Zugriffsmethoden.

So gut kann ich sagen record array und recarray sind die gleichen.

andere Datei zeigt etwas von der Geschichte

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

Sammlung von Werkzeugen strukturierte Arrays zu manipulieren. Die meisten dieser Funktionen wurden ursprünglich von John Hunter für Matplotlib implementiert. Sie wurden umgeschrieben und zur Vereinfachung erweitert.

Viele der Funktionen in dieser Datei endet mit:

if asrecarray: 
     output = output.view(recarray) 

Die Tatsache, dass Sie ein Array zurückgeben kann als recarray Ansicht zeigt, wie ‚dünn‘ ist diese Schicht.

numpy hat eine lange Geschichte und führt mehrere unabhängige Projekte zusammen. Mein Eindruck ist, dass recarray eine ältere Idee ist, und strukturierte Arrays die aktuelle Implementierung, die auf einem verallgemeinerten dtype aufgebaut ist. recarrays scheinen für Bequemlichkeit und Rückwärtskompatibilität als jede neue Entwicklung gehalten werden. Aber ich müsste die github Dateihistorie studieren, und alle letzten Probleme/Pull-Anfragen, um sicher zu sein.