从字典列表中创建NumPy记录数组的最简单方法是什么?

Rog*_*ger 10 python numpy

假设我有类似的数据d = [dict(animal='cat', weight=5), dict(animal='dog', weight=20)](基本上是JSON,其中所有条目都具有一致的数据类型).

在Pandas中你可以把它变成一个表df = pandas.DataFrame(d)- 是否有类似于普通NumPy记录数组的东西?np.rec.fromrecords(d)似乎没有给我我想要的东西.

hpa*_*ulj 6

您可以创建一个正确大小和dtype的空结构化数组,然后从列表中填充它.

http://docs.scipy.org/doc/numpy/user/basics.rec.html

结构化数组可以按字段或逐行填充....如果你逐行填充它,它需要一个元组(但不是列表或数组!):

In [72]: dt=dtype([('weight',int),('animal','S10')])

In [73]: values = [tuple(each.values()) for each in d]

In [74]: values
Out[74]: [(5, 'cat'), (20, 'dog')]
Run Code Online (Sandbox Code Playgroud)

字段中dt出现的顺序与中的顺序相同values.

In [75]: a=np.zeros((2,),dtype=dt)

In [76]: a[:]=[tuple(each.values()) for each in d]

In [77]: a
Out[77]: 
array([(5, 'cat'), (20, 'dog')], 
      dtype=[('weight', '<i4'), ('animal', 'S10')])
Run Code Online (Sandbox Code Playgroud)

通过更多测试,我发现我可以直接从中创建数组values.

In [83]: a = np.array(values, dtype=dt)

In [84]: a
Out[84]: 
array([(5, 'cat'), (20, 'dog')], 
      dtype=[('weight', '<i4'), ('animal', 'S10')])
Run Code Online (Sandbox Code Playgroud)

dtype可从字典项中的一个(或多个)可以推断:

def gettype(v):
    if isinstance(v,int): return 'int'
    elif isinstance(v,float): return 'float'
    else:
        assert isinstance(v,str)
        return '|S%s'%(len(v)+10)
d0 = d[0]
names = d0.keys()
formats = [gettype(v) for v in d0.values()]
dt = np.dtype({'names':names, 'formats':formats})
Run Code Online (Sandbox Code Playgroud)

生产:

dtype=[('weight', '<i4'), ('animal', 'S13')]
Run Code Online (Sandbox Code Playgroud)


ZJS*_*ZJS 5

好吧,你可以让你的生活变得更加轻松,只需依赖 Pandas,因为 numpy 不使用列标题

熊猫

df = pandas.DataFrame(d)
numpyMatrix = df.as_matrix() #spits out a numpy matrix
Run Code Online (Sandbox Code Playgroud)

或者您可以忽略 Pandas 并使用 numpy + 列表理解将字典分解为值并存储为矩阵

麻木

numpMatrix = numpy.matrix([each.values() for each in d])
Run Code Online (Sandbox Code Playgroud)

  • 我希望避免使用 pandas,第二个示例不保留字段名称(“animal”和“weight”)。 (2认同)