
理解数据结构:NumPy数组中的字典
在数据处理过程中,我们有时会遇到将python字典封装到numpy数组中的情况。例如,在对csv文件进行数据清洗和聚合后,可能会得到一个以城市名为键、总伤亡人数为值的字典。如果这个字典随后被直接传递给np.array(),numpy会将其视为一个单一的python对象存储在数组中。
考虑以下场景,我们已经从数据源中聚合了各个城市的伤亡人数,并存储在一个字典中:
import numpy as np
city_casualties = {
'New Delhi': 2095, 'Samastipur': 4, 'Bombay': 210, 'Imphal': 603, 'Aizawl': 2,
'Amapur': 2, 'Raisikah': 1, 'Champhai': 1, 'Jamshedpur': 32, 'Chennai': 366,
'Chiaplant': 1, 'Tindol': 7, 'Calcutta': 57, 'Tirupattur': 6, 'Gauhati': 112,
'Jorhat': 3, 'Massad': 1, 'Chandigarh': 333, 'Jodhpur': 2, 'Amritsar': 768,
'Tipaimukh': 6, 'Guwahati': 822, 'Harchowal': 1, 'Mothan Wala': 2, 'Qadian': 7,
'Baloda Bazar': 10
}
# 将字典封装到NumPy数组中
np_city_data = np.array(city_casualties)
print("封装在NumPy数组中的原始字典内容:")
print(np_city_data)
print("NumPy数组的类型:", type(np_city_data))
print("NumPy数组中元素的类型:", np_city_data.dtype)输出显示np_city_data是一个dtype=object的NumPy数组,其内部包含了一个Python字典。此时,直接对np_city_data进行字典操作是不可行的,因为它是一个NumPy数组,而非直接的字典对象。
从NumPy数组中提取字典
要对NumPy数组中的字典进行操作,首先需要将该字典对象从数组中提取出来。当NumPy数组只包含一个元素(即我们的字典)时,可以使用np.array.item()方法来获取这个唯一的Python对象。
# 从NumPy数组中提取字典对象
actual_dict = np_city_data.item()
print("\n从NumPy数组中提取的字典对象:")
print(actual_dict)
print("提取后对象的类型:", type(actual_dict))现在,actual_dict变量存储的就是原始的Python字典,我们可以对其执行标准的字典操作。
立即学习“Python免费学习笔记(深入)”;
对字典进行值排序并重构
目标是根据字典的值(例如,城市的总伤亡人数)进行降序排序。Python提供了sorted()内置函数,结合dict.items()方法和lambda表达式,可以高效地完成这项任务。
- dict.items(): 此方法返回一个包含字典所有键值对的视图对象,每个键值对表示为一个元组(key, value)。
-
sorted(): 这个函数可以对任何可迭代对象进行排序。
- key=lambda item: item[1]:这是一个匿名函数,用于指定排序的依据。item代表items()返回的每个元组(key, value)。item[1]表示元组中的第二个元素,即字典的值。
- reverse=True:这个参数表示进行降序排序。
- 字典推导式: 排序后的结果是一个元组列表。为了将其转换回字典并保持排序顺序(Python 3.7+版本字典保持插入顺序),可以使用字典推导式。
下面是完整的排序和重构过程:
# 1. 访问NumPy数组中的字典对象 (如果尚未提取)
actual_dict = np_city_data.item()
# 2. 对字典的键值对进行排序
# 按照字典的值(伤亡人数)进行降序排序
sorted_items = sorted(actual_dict.items(), key=lambda item: item[1], reverse=True)
# 3. 将排序后的键值对重新构建成字典
sorted_city_casualties = {key: value for key, value in sorted_items}
print("\n按伤亡人数降序排序后的城市字典:")
print(sorted_city_casualties)
# 如果需要,可以进一步提取前N个结果
top_5_cities = dict(list(sorted_city_casualties.items())[:5])
print("\n前5个伤亡人数最多的城市:")
print(top_5_cities)通过以上步骤,我们成功地从NumPy数组中提取了字典,并对其进行了值降序排序,最终得到了一个按需求排列的城市伤亡数据字典。
注意事项
- np.array.item()的适用性: item()方法主要用于获取只包含一个元素的NumPy数组中的Python对象。如果NumPy数组中包含多个元素(例如np.array([dict1, dict2, dict3])),则需要通过索引(如np_array[0])来访问特定的字典,或者遍历数组中的每个元素。
- NumPy数组的用途: 通常情况下,NumPy数组设计用于存储同质的数值数据,以便进行高效的数值计算。将单个Python字典放入NumPy数组中,并不会带来NumPy的性能优势,反而增加了访问复杂性。如果只是需要存储和操作字典,直接使用Python字典即可。
- 字典的有序性: 在Python 3.7及更高版本中,字典会保持元素的插入顺序。因此,通过字典推导式从排序后的键值对列表重建字典,其顺序将得到保留。
- 排序键的灵活性: lambda表达式提供了极大的灵活性,你可以根据需要修改key参数来按键排序、按值排序,或基于更复杂的逻辑进行排序。例如,key=lambda item: item[0]将按键(城市名)进行排序。
总结
本教程详细阐述了如何在NumPy数组中处理内嵌字典的排序问题。核心步骤包括使用np.array.item()提取字典,然后利用Python内置的sorted()函数、dict.items()方法以及lambda表达式对字典进行值排序,并通过字典推导式重建有序字典。掌握这些技巧对于处理复杂数据结构和实现特定数据分析需求至关重要。










