gpt4 book ai didi

python - 从字典列表创建 NumPy 记录数组的最简单方法?

转载 作者:太空狗 更新时间:2023-10-29 20:22:55 25 4
gpt4 key购买 nike

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

在 Pandas 中,您可以使用 df = pandas.DataFrame(d) 将其创建为一个表——是否有可与普通 NumPy 记录数组相媲美的东西? np.rec.fromrecords(d) 似乎没有给我我想要的东西。

最佳答案

您可以创建一个具有正确大小和数据类型的空结构化数组,然后从列表中填充它。

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

Structured arrays can be filled by field or row by row. ... If you fill it in row by row, it takes a take a tuple (but not a list or array!):

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')]

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')])

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

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

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

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})

制作:

dtype=[('weight', '<i4'), ('animal', 'S13')]

关于python - 从字典列表创建 NumPy 记录数组的最简单方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24792690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com