<p>记录/重新排列在</p>
<p><a href="https://github.com/numpy/numpy/blob/master/numpy/core/records.py" rel="noreferrer">https://github.com/numpy/numpy/blob/master/numpy/core/records.py</a></p>
<p>本文件中的一些相关引用</p>
<blockquote>
<p>Record Arrays
Record arrays expose the fields of structured arrays as properties.
The recarray is almost identical to a standard array (which supports
named fields already) The biggest difference is that it can use
attribute-lookup to find the fields and it is constructed using
a record.</p>
</blockquote>
<p><code>recarray</code>是<code>ndarray</code>的一个子类(与<code>matrix</code>和<code>masked arrays</code>相同)。但请注意,它的构造函数与<code>np.array</code>不同。更像是<code>np.empty(size, dtype)</code>。</p>
<pre><code>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.
</code></pre>
<p>将唯一字段实现为属性行为的关键函数是<code>__getattribute__</code>(<code>__getitem__</code>实现索引):</p>
<pre><code>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)
</code></pre>
<p>它首先尝试获取一个常规属性,比如<code>.shape</code>、<code>.strides</code>、<code>.data</code>,以及所有方法(<code>.sum</code>、<code>.reshape</code>,等等)。如果失败,则在<code>dtype</code>字段名中查找名称。所以它实际上只是一个结构化数组,包含一些重新定义的访问方法。</p>
<p>我只能说<code>record array</code>和<code>recarray</code>是一样的。</p>
<p>另一个文件显示了一些历史</p>
<p><a href="https://github.com/numpy/numpy/blob/master/numpy/lib/recfunctions.py" rel="noreferrer">https://github.com/numpy/numpy/blob/master/numpy/lib/recfunctions.py</a></p>
<blockquote>
<p>Collection of utilities to manipulate structured arrays.
Most of these functions were initially implemented by John Hunter for
matplotlib. They have been rewritten and extended for convenience.</p>
</blockquote>
<p>此文件中的许多函数以以下结尾:</p>
<pre><code> if asrecarray:
output = output.view(recarray)
</code></pre>
<p>您可以返回一个数组作为<code>recarray</code>视图这一事实显示了这个层有多么“薄”。</p>
<p><code>numpy</code>历史悠久,合并了几个独立的项目。我的印象是<code>recarray</code>是一个较老的概念,并且结构化数组是当前构建在广义<code>dtype</code>基础上的实现。<code>recarrays</code>似乎是为了方便和向后兼容而保留的。但我必须研究<code>github</code>文件历史,以及任何最近的问题/请求才能确定。</p>