当前位置: 首页 > 面试题库 >

NumPy“记录数组”或“结构化数组”或“ recarray”

马丰
2023-03-14
问题内容

NumPy“结构化数组”,“记录数组”和“ recarray”之间的区别是什么?

该NumPy的文档
暗示,前两个是相同的:如果是这样,这是该对象的首选术语?

同样的文件说,(在页面的底部):你可以找到关于recarrays和结构化阵列(包括两者之间的区别)一些更多的信息在这里。是否有对此差异的简单解释?


问题答案:

记录/记录数组在

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

此文件中的一些相关引号

记录数组记录数组将结构化数组的字段公开为属性。recarray与标准数组几乎完全相同(标准数组已经支持命名字段),最大的区别是它可以使用属性查找来查找字段,并使用记录进行构造。

recarrayndarraymatrix和和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的文档中也没有找到任何有关此功能的信息。函数发