[英]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.