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ść.
[Strukturowe tablice (inaczej "Tablice rekordów")] (http://docs.scipy.org/doc/numpy/user/basics.rec.html) –
Wyjaśniłem pytanie, @Ashwini Chaudhary - dziękuję . – xnx
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