NumPy“结构化数组”,“记录数组”和“ recarray”之间的区别是什么?
该NumPy的文档
暗示,前两个是相同的:如果是这样,这是该对象的首选术语?
同样的文件说,(在页面的底部):你可以找到关于recarrays和结构化阵列(包括两者之间的区别)一些更多的信息在这里。是否有对此差异的简单解释?
记录/记录数组在
https://github.com/numpy/numpy/blob/master/numpy/core/records.py
此文件中的一些相关引号
记录数组记录数组将结构化数组的字段公开为属性。recarray与标准数组几乎完全相同(标准数组已经支持命名字段),最大的区别是它可以使用属性查找来查找字段,并使用记录进行构造。
recarray
是ndarray
(matrix
和和masked arrays
是)相同的子类。但请注意,它的构造函数不同于np.array
。更像是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.
将唯一字段实现为属性行为的关键功能是__getattribute__
(__getitem__
实现索引):
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)
它首先它会尝试获取常规属性-
比如.shape
,.strides
,.data
,以及所有的方法(.sum
,.reshape
等)。如果失败,它将在dtype
字段名称中查找名称。因此,它实际上只是带有一些重新定义的访问方法的结构化数组。
尽我所能告诉,record array
并且recarray
是相同的。
另一个文件显示了一些历史
https://github.com/numpy/numpy/blob/master/numpy/lib/recfunctions.py
实用程序集合,用于操纵结构化数组。其中大多数功能最初是由John Hunter为matplotlib实现的。为了方便起见,它们已被重写和扩展。
该文件中的许多功能都以:
if asrecarray:
output = output.view(recarray)
您可以将数组作为recarray
视图返回,这一事实表明了该层的“厚度”。
numpy
历史悠久,并合并了几个独立的项目。我的印象是,这recarray
是一个较旧的主意,结构化数组是基于generalized的当前实现的dtype
。
recarrays
似乎为了方便和向后兼容而保留了比任何新开发的产品。但是我必须研究github
文件历史记录以及任何最近出现的问题/请求才能确定。
问题内容: 我有一个字典,需要将其转换为NumPy结构化数组。我正在使用arcpy函数,因此NumPy结构化数组是唯一可以使用的数据格式。 我已经试过了: 但我不断 下面的方法有效,但是很愚蠢,显然不适用于真实数据。我知道有一个更优雅的方法,我只是想不通。 问题答案: 您可以使用: 产量 如果您不想创建元组的中间列表,则可以改用: 在Python2中: 在Python3中: 为什么使用该列表不起作
问题内容: 我正在尝试将二维数组转换为具有命名字段的结构化数组。我希望2D数组中的每一行成为结构化数组中的新记录。不幸的是,我没有尝试过以我期望的方式工作。 我从开始: 我想转换为以下形式: 我尝试过的 这两种方法都尝试将myarray中的每个条目转换为具有给定dtype的记录,因此将插入多余的零。我不知道如何获取它以将每一行转换为一条记录。 另一尝试: 这次不执行任何实际转换。内存中的现有数据只
原文:Structured arrays 介绍 结构化数组其实就是ndarrays,其数据类型是由组成一系列命名字段的简单数据类型组成的。 例如: >>> x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)], ... dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4
问题内容: 我有以下数据 我得到一个 到目前为止,很好,我有一个数据结构,可以按列名进行寻址 下一个步骤,问题- 我有一个功能,在输入有地理坐标(的两个向量和当然的),并返回两个阵列和在地图上突出位置(此工程确定)。 我可以使用单独的向量,但是我想添加两个新列和。我的天真尝试 提出了一个,教我说它具有字典的某些特征,但是字典却没有。 我可以做吗?tia 请考虑这不适用于结构化数组或记录数组,大多数
问题内容: 将字段添加到结构化numpy数组的最干净方法是什么?可以破坏性地完成它,还是必须创建一个新数组并在现有字段上进行复制?每个字段的内容是否连续存储在内存中,以便可以高效地进行复制? 问题答案: 如果您使用的是numpy 1.3,则还有numpy.lib.recfunctions.append_fields()。 对于许多安装,您将需要访问它。不允许一个人看到
问题内容: 我知道已经有一个关于此主题的问题(将字段添加到结构化numpy数组的最简洁方法),请参阅 将字段添加到结构化的numpy数组 但是我对那里给出的答案有疑问… 如果您使用的是numpy 1.3,那么还有numpy.lib.recfunctions.append_fields() 我仍然有numpy 1.3,但它无法识别此功能,并且在numpy的文档中也没有找到任何有关此功能的信息。函数发