这是关于编程风格的更多问题。 我删除了以下字段的网页:“温度:51 - 62”,“高度:1000-1500”......等结果保存在字典中
{"temperature": "51-62", "height":"1000-1500" ...... }
所有键和值都是字符串类型。每个键都可以映射到许多可能值中的一个。现在我想将这个字典转换为numpy数组/向量。我有以下问题:
我想知道在Python中编写这种转换的最清晰有效的方法是什么。我正在考虑构建另一个字典,将关键字映射到向量的索引号。还有许多其他字典将值映射到整数。
我遇到的另一个问题是我不确定某些键的范围。我想动态跟踪字符串值和整数之间的映射。例如,我可能会发现key1将来可以映射到val1_8。
谢谢
答案 0 :(得分:7)
尝试一个pandas系列,它是为此而构建的。
import pandas as pd
s = pd.Series({'a':1, 'b':2, 'c':3})
s.values # a numpy array
答案 1 :(得分:1)
>>> # a sequence of dictionaries in an interable called 'data'
>>> # assuming that not all dicts have the same keys
>>> pprint(data)
[{'x': 7.0, 'y1': 2.773, 'y2': 4.5, 'y3': 2.0},
{'x': 0.081, 'y1': 1.171, 'y2': 4.44, 'y3': 2.576},
{'y1': 0.671, 'y3': 3.173},
{'x': 0.242, 'y2': 3.978, 'y3': 3.791},
{'x': 0.323, 'y1': 2.088, 'y2': 3.602, 'y3': 4.43}]
>>> # get the unique keys across entire dataset
>>> keys = [list(dx.keys()) for dx in data]
>>> # flatten and coerce to 'set'
>>> keys = {itm for inner_list in keys for itm in inner_list}
>>> # create a map (look-up table) from each key
>>> # to a column in a NumPy array
>>> LuT = dict(enumerate(keys))
>>> LuT
{'y2': 0, 'y3': 1, 'y1': 2, 'x': 3}
>>> idx = list(LuT.values())
>>> # pre-allocate NUmPy array (100 rows is arbitrary)
>>> # number of columns is len(LuT.keys())
>>> D = NP.empty((100, len(LuT.keys())))
>>> keys = list(LuT.keys())
>>> keys
[0, 1, 2, 3]
>>> # now populate the array from the original data using LuT
>>> for i, row in enumerate(data):
D[i,:] = [ row.get(LuT[k], 0) for k in keys ]
>> D[:5,:]
array([[ 4.5 , 2. , 2.773, 7. ],
[ 4.44 , 2.576, 1.171, 0.081],
[ 0. , 3.173, 0.671, 0. ],
[ 3.978, 3.791, 0. , 0.242],
[ 3.602, 4.43 , 2.088, 0.323]])
将上一个结果(D的前5行)与上面的数据进行比较
请注意,对于每行(单个字典),使用不完整的键集保留排序 - 换句话说,D 的 第2列始终对应于键入 y2, 等的值,即使数据中的给定行没有为该键存储的值;例如,查看数据中的第三行,其中只有两个键/值对,在D的第三行中,第一列和最后一列都是 0 ,这些列对应于键 x 和 y2 ,实际上是两个缺失的密钥