假设我有类似的数据d = [dict(animal='cat', weight=5), dict(animal='dog', weight=20)](基本上是JSON,其中所有条目都具有一致的数据类型).
在Pandas中你可以把它变成一个表df = pandas.DataFrame(d)- 是否有类似于普通NumPy记录数组的东西?np.rec.fromrecords(d)似乎没有给我我想要的东西.
您可以创建一个正确大小和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)
好吧,你可以让你的生活变得更加轻松,只需依赖 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)
| 归档时间: |
|
| 查看次数: |
5560 次 |
| 最近记录: |