将字典列表转换为1D numpy数组

时间:2017-09-17 17:54:36

标签: python numpy dictionary

我有一个词典列表,所有词典都有相同的10个关键词。

寻找一种巧妙的方法将其转换为10个1D numpy数组。效率并不重要。

目前有20行代码。

names = [x['name'] for x in fields] 
names = np.asarray(names)

2 个答案:

答案 0 :(得分:0)

您可以使用嵌套列表理解:

[np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']]

或dict comprehension:

{attribute:np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']}

举个例子:

>>> fields = [{'name': 'A', 'age': 25, 'address' : 'NYC'}, {'name': 'B', 'age': 32, 'address' : 'LA'}]

>>> [np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']]
[array(['A', 'B'],
      dtype='|S1'), array([25, 32]), array(['NYC', 'LA'],
      dtype='|S3')]
>>> {attribute:np.asarray([x[attribute] for x in fields]) for attribute in ['name', 'age', 'address']}
{'age': array([25, 32]), 'name': array(['A', 'B'],
      dtype='|S1'), 'address': array(['NYC', 'LA'],
      dtype='|S3')}

要以自动方式获取属性,您可以使用:

>>> fields[0].keys()
['age', 'name', 'address']

最后,pandas DataFrame可能是最适合您数据的类型:

>>> pd.DataFrame(fields)
  address  age name
0     NYC   25    A
1      LA   32    B

它会很快,并且应该允许您在阵列列表上执行任何操作。

答案 1 :(得分:0)

A成为词典的输入列表。

对于2D数组输出,每行包含每个关键字的数据 -

np.column_stack([i.values() for i in A])

示例运行 -

In [217]: A # input list of 2 dictionaries, each with same 3 keywords
Out[217]: 
[{'a': array([6, 8, 2]), 'b': array([7, 7, 3]), 'c': array([6, 6, 4])},
 {'a': array([4, 4, 3]), 'b': array([7, 1, 6]), 'c': array([6, 1, 5])}]

In [244]: np.column_stack([i.values() for i in A])
Out[244]: 
array([[6, 8, 2, 4, 4, 3],    # key : a
       [6, 6, 4, 6, 1, 5],    # key : c
       [7, 7, 3, 7, 1, 6]])   # key : b

# Get those keywords per row with `keys()` :
In [263]: A[0].keys()
Out[263]: ['a', 'c', 'b']

再运行一次样本 -

In [245]: fields # sample from @Eric's solution
Out[245]: 
[{'address': 'NYC', 'age': 25, 'name': 'A'},
 {'address': 'LA', 'age': 32, 'name': 'B'}]

In [246]: np.column_stack([i.values() for i in fields])
Out[246]: 
array([['25', '32'],
       ['A', 'B'],
       ['NYC', 'LA']],
      dtype='|S21')

In [267]: fields[0].keys()
Out[267]: ['age', 'name', 'address']