繁体   English   中英

如何将多个numpy数组合并到字典列表中

[英]How to combine multiple numpy arrays into a dictionary list

我有以下数组:

column_names = ['id', 'temperature', 'price']

三个numpy数组如下:

idArry = ([1,2,3,4,....])

tempArry = ([20.3,30.4,50.4,.....])

priceArry = ([1.2,3.5,2.3,.....])

我想将上面的内容组合成一个字典,如下所示:

table_dict = ( {'id':1, 'temperature':20.3, 'price':1.2 },
               {'id':2, 'temperature':30.4, 'price':3.5},...)

我可以使用for循环和append来创建字典,但列表是大约15000行。 有人可以告诉我如何使用python zip功能或其他更高效,快捷的方式来实现上述要求吗?

您可以使用listcomp和函数zip()

[{'id': i, 'temperature': j, 'price': k} for i, j, k in zip(idArry, tempArry, priceArry)]
# [{'id': 1, 'temperature': 20.3, 'price': 1.2}, {'id': 2, 'temperature': 30.4, 'price': 3.5}]

如果您的ID为1,2,3 ......并且您使用的是列表,那么您的ID中不需要ID。 这是列表中的冗余信息。

[{'temperature': i, 'price': j} for i, j in zip(tempArry, priceArry)]

你也可以使用dicts的词典。 dict中的查找必须比列表中的查找快。

{i: {'temperature': j, 'price': k} for i, j, k in zip(idArry, tempArry, priceArry)}
# {1: {'temperature': 20.3, 'price': 1.2}, 2: {'temperature': 30.4, 'price': 3.5}}

这可行。 枚举用于创建一个从0开始的计数器,然后从tempArry和priceArray中提取每个适用的值。 这也创建了一个有助于内存的生成器表达式(特别是如果你的列表非常大)。

new_dict = ({'id': i + 1 , 'temperature': tempArry[i], 'price': priceArry[i]} for i, _ in enumerate(idArry))

我来看看pandas包的功能。 特别是有一个pandas.DataFrame.to_dict方法。

我相信对于大型数组,这种方法应该非常快(尽管我愿意让zip方法更有效)。

在下面的示例中,我首先从数组中构造一个pandas数据帧,然后使用to_dict方法。

import numpy as np
import pandas as pd

column_names = ['id', 'temperature', 'price']

idArry = np.array([1, 2, 3])
tempArry = np.array([20.3, 30.4, 50.4])
priceArry = np.array([1.2, 3.5, 2.3])

df = pd.DataFrame(np.vstack([idArry, tempArry, priceArry]).T, columns=column_names)

table_dict = df.to_dict(orient='records')

你可以使用list-comprehension来迭代其中一个数组来实现这个目的:

[{'id': idArry[i], 'temperature': tempArry[i], 'price': priceArry[i]} for i in range(len(idArry))]

您可以构建一个NumPy矩阵,然后转换为字典,如下所示。 给出你的数据(我只是改变了值):

import numpy as np

idArry = np.array([1,2,3,4])
tempArry = np.array([20,30,50,40])
priceArry = np.array([200,300,100,400])

构建矩阵:

table = np.array([idArry, tempArry, priceArry]).transpose()

创建字典:

dict_table = [ dict(zip(column_names, values)) for values in table ]
#=> [{'id': 2, 'temperature': 30, 'price': 300}, {'id': 3, 'temperature': 50, 'price': 100}, {'id': 4, 'temperature': 40, 'price': 400}]


我不知道目的,但也许你也可以使用矩阵如下。

 temp_col = table[:,1] table[temp_col >= 40] # [[ 3 50 100] # [ 4 40 400]] 

一种方法如下:

column_names = ['id', 'temperature', 'price']

idArry = ([1,2,3,4])
tempArry = ([20.3,30.4,50.4, 4])
priceArry = ([1.2,3.5,2.3, 4.5])

您可以zip不同列表中的所有元素:

l = zip(idArry,tempArry,priceArry)

print(list(l))
[(1, 20.3, 1.2), (2, 30.4, 3.5), (3, 50.4, 2.3), (4, 4, 4.5)]

and by iterating over the elements in l as so: 并使用推导将内部词典附加到列表中,并迭代l的元素,如下所示:

[dict(zip(column_names, next(l))) for i in range(len(idArry))]

[{'id': 1, 'temperature': 20.3, 'price': 1.2},
 {'id': 2, 'temperature': 30.4, 'price': 3.5},
 {'id': 3, 'temperature': 50.4, 'price': 2.3},
 {'id': 4, 'temperature': 4, 'price': 4.5}]

使用此方法的优点是它只使用内置方法,并且适用于任意数量的column_names

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM