我有一个字典,需要将其转换为NumPy结构化数组。我正在使用arcpy函数NumPyArraytoTable
,因此NumPy结构化数组是唯一可以使用的数据格式。
我已经试过了:
result = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}
names = ['id','data']
formats = ['f8','f8']
dtype = dict(names = names, formats=formats)
array=numpy.array([[key,val] for (key,val) in result.iteritems()],dtype)
但我不断 expected a readable buffer object
下面的方法有效,但是很愚蠢,显然不适用于真实数据。我知道有一个更优雅的方法,我只是想不通。
totable = numpy.array([[key,val] for (key,val) in result.iteritems()])
array=numpy.array([(totable[0,0],totable[0,1]),(totable[1,0],totable[1,1])],dtype)
您可以使用np.array(list(result.items()), dtype=dtype)
:
import numpy as np
result = {0: 1.1181753789488595, 1: 0.5566080288678394, 2: 0.4718269778030734, 3: 0.48716683119447185, 4: 1.0, 5: 0.1395076201641266, 6: 0.20941558441558442}
names = ['id','data']
formats = ['f8','f8']
dtype = dict(names = names, formats=formats)
array = np.array(list(result.items()), dtype=dtype)
print(repr(array))
产量
array([(0.0, 1.1181753789488595), (1.0, 0.5566080288678394),
(2.0, 0.4718269778030734), (3.0, 0.48716683119447185), (4.0, 1.0),
(5.0, 0.1395076201641266), (6.0, 0.20941558441558442)],
dtype=[('id', '<f8'), ('data', '<f8')])
如果您不想创建元组的中间列表list(result.items())
,则可以改用np.fromiter
:
在Python2中:
array = np.fromiter(result.iteritems(), dtype=dtype, count=len(result))
在Python3中:
array = np.fromiter(result.items(), dtype=dtype, count=len(result))
为什么使用该列表[key,val]
不起作用:
顺便说一句,您的尝试,
numpy.array([[key,val] for (key,val) in result.iteritems()],dtype)
非常接近工作。如果将列表更改为[key, val]
元组(key, val)
,则它会起作用。当然,
numpy.array([(key,val) for (key,val) in result.iteritems()], dtype)
和…一样
numpy.array(result.items(), dtype)
在Python2中,或
numpy.array(list(result.items()), dtype)
在Python3中。
np.array
处理列表与元组的方法不同:Robert Kern解释说:
通常,将元组视为“标量”记录,然后重复列出。该规则有助于numpy.array()找出哪些序列是记录,哪些是要重现的其他序列;即哪些序列创建了另一个维度,哪些是原子元素。
由于(0.0, 1.1181753789488595)
被认为是这些原子元素之一,因此它应该是一个元组,而不是列表。
问题内容: 我有以下数据 我得到一个 到目前为止,很好,我有一个数据结构,可以按列名进行寻址 下一个步骤,问题- 我有一个功能,在输入有地理坐标(的两个向量和当然的),并返回两个阵列和在地图上突出位置(此工程确定)。 我可以使用单独的向量,但是我想添加两个新列和。我的天真尝试 提出了一个,教我说它具有字典的某些特征,但是字典却没有。 我可以做吗?tia 请考虑这不适用于结构化数组或记录数组,大多数
问题内容: 将字段添加到结构化numpy数组的最干净方法是什么?可以破坏性地完成它,还是必须创建一个新数组并在现有字段上进行复制?每个字段的内容是否连续存储在内存中,以便可以高效地进行复制? 问题答案: 如果您使用的是numpy 1.3,则还有numpy.lib.recfunctions.append_fields()。 对于许多安装,您将需要访问它。不允许一个人看到
问题内容: 我正在尝试将二维数组转换为具有命名字段的结构化数组。我希望2D数组中的每一行成为结构化数组中的新记录。不幸的是,我没有尝试过以我期望的方式工作。 我从开始: 我想转换为以下形式: 我尝试过的 这两种方法都尝试将myarray中的每个条目转换为具有给定dtype的记录,因此将插入多余的零。我不知道如何获取它以将每一行转换为一条记录。 另一尝试: 这次不执行任何实际转换。内存中的现有数据只
问题内容: NumPy“结构化数组”,“记录数组”和“ recarray”之间的区别是什么? 该NumPy的文档 暗示,前两个是相同的:如果是这样,这是该对象的首选术语? 同样的文件说,(在页面的底部):你可以找到关于recarrays和结构化阵列(包括两者之间的区别)一些更多的信息在这里。是否有对此差异的简单解释? 问题答案: 记录/记录数组在 https://github.com/numpy/
问题内容: 我知道已经有一个关于此主题的问题(将字段添加到结构化numpy数组的最简洁方法),请参阅 将字段添加到结构化的numpy数组 但是我对那里给出的答案有疑问… 如果您使用的是numpy 1.3,那么还有numpy.lib.recfunctions.append_fields() 我仍然有numpy 1.3,但它无法识别此功能,并且在numpy的文档中也没有找到任何有关此功能的信息。函数发
原文:Structured arrays 介绍 结构化数组其实就是ndarrays,其数据类型是由组成一系列命名字段的简单数据类型组成的。 例如: >>> x = np.array([('Rex', 9, 81.0), ('Fido', 3, 27.0)], ... dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4