我有一个字典,需要将其转换为NumPy结构化数组。我正在使用arcpy函数NumPyArraytoTable,因此NumPy结构化数组是唯一可以使用的数据格式。
NumPyArraytoTable
我已经试过了:
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
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):
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:
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]不起作用:
[key,val]
顺便说一句,您的尝试,
numpy.array([[key,val] for (key,val) in result.iteritems()],dtype)
非常接近工作。如果将列表更改为[key, val]元组(key, val),则它会起作用。当然,
[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解释说:
np.array
通常,将元组视为“标量”记录,然后重复列出。该规则有助于numpy.array()找出哪些序列是记录,哪些是要重现的其他序列;即哪些序列创建了另一个维度,哪些是原子元素。
由于(0.0, 1.1181753789488595)被认为是这些原子元素之一,因此它应该是一个元组,而不是列表。
(0.0, 1.1181753789488595)