Python数据处理中能用到的小知识点

本文介绍了一些实用的Python数据处理技巧,包括如何通过字典的值查找键、使用字典表示一对多关系、列表去重的方法及保持原有顺序的技巧、以及在pandas DataFrame中根据需求去除指定行的方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明:写这个博客是本人在做毕设时发现有时候处理数据会用到一些网上的教程中没有且很有用的小知识。而且有些在找的时候会比较麻烦,所以打算记录下来以备不时之需,另外以下的所有代码的Python版本为3.5,且以后可能会更新。

1、字典(dict)根据值(value)取对应的键(key)

可以根据字典推导式反转原字典的key和value,然后根据value选key。

a_dict = {'a':1,'b':2,'c':3}
print(a_dict)
a_new_dict = {v: k for k,v in a_dict.items()}
print(a_new_dict)
print(a_new_dict[1])

运行结果:

{'c': 3, 'a': 1, 'b': 2}
{1: 'a', 2: 'b', 3: 'c'}
a

2、用字典(dict)表示一对多的对应关系

当需要表示一个一对的的关系时,可以用dict来实现,只不过是把value换成了一个列表(list)而已。

list_1 = ['Gray','Harry','Bob']
dict_1 = {'name':list_1}
print(dict_1)

运行结果:

{'name': ['Gray', 'Harry', 'Bob']}

注:当需要访问指定key的某个值时可以用dict_1[key][i]来进行访问

3、对列表(list)中元素进行去重

有时会对list中的元素进行去重处理,就可以利用下面几种办法:

1、先将list转为set再转回list

list_1 = [4,6,3,2,1,1,2,3,1,4,5]
list_2 = list(set(list_1))
print(list_2)

运行结果:

[1, 2, 3, 4, 5, 6]

2、 利用dict的fromkeys()方法(key唯一性)

list_1 = [4,6,3,2,1,1,2,3,1,4,5]
list_2 = list(dict.fromkeys(list_1).keys())
print(list_2)

运行结果:

[1, 2, 3, 4, 5, 6]

注:从上面的结果可以看的出来,这两种方法会将原来的顺序打乱,如果你的数据与顺序相关就不要用这两种办法了

3、利用sorted方法

list_1 = [4,6,3,2,1,1,2,3,1,4,5]
list_2 = sorted(set(list_1),key = list_1.index)
print(list_2)

运行结果:

[4, 6, 3, 2, 1, 5]

4、可以利用遍历来实现

list_1 = [4,6,3,2,1,1,2,3,1,4,5]
list_2 = []
for i in list_1:
    if not i in list_2:
        list_2.append(i)
print(list_2)

运行结果:

[4, 6, 3, 2, 1, 5]

5、pandas.DataFrame根据需求去除指定的行

在DataFrame中想要得到指定的行是很容易的,在很多的pandas教程中都会提到,但是想要得到除了这些行以外的其他行的数据就有点麻烦了,看下面的例子:

import pandas as pd
df_1 = pd.DataFrame([['Bob','Gray','Dave'],['Trae','Tore','John'],['Amy','Kim','Mary'],['David','James','Sunny']],columns = ['c1','c2','c3'])
print(df_1)

运行结果:

      c1     c2     c3
0    Bob   Gray   Dave
1   Trae   Tore   John
2    Amy    Kim   Mary
3  David  James  Sunny

如果想要得到c1这列除了值为’Bob’和’Amy’的其他所有行,就可以用下面的方法:

list_1 = list(df_1.c1)
list_1.remove('Bob')
list_1.remove('Amy')
df_2 = df_1[df_1.c1.isin(list_1)]
print(df_2)

运行结果:

      c1     c2     c3
1   Trae   Tore   John
3  David  James  Sunny

注:如果想要新生成的DataFrame使用新的索引可以利用df_2.reset_index(drop = True)实现

<think>好的,用户之前问过关于七段数码管识别的Python代码,现在他们进一步询问是否有专门的库或算法。我需要先回顾之前的对话,确保回答的一致性。 用户当前的提问是关于Python中能识别七段电子数字的库或算法。之前的回答中,我提供了一个基于OpenCV和NumPy的简化示例,说明用户可能已经尝试过自己实现,但希望找到更成熟的解决方案。 首先,我需要确认是否存在专门用于七段数码管识别的库。根据我的知识,可能没有专门的库,但有很多使用通用图像处理和机器学习的方法。需要列举常见的算法和可能用到的库,比如OpenCV、Tesseract,以及机器学习框架如TensorFlow或PyTorch。 然后,用户的需求可能是想找一个现成的解决方案,或者了解不同的方法以便选择适合的。需要分点说明不同的方法,包括传统图像处理和深度学习,同时提到可能用到的库。 此外,用户可能的应用场景可能是物联网、工业检测等,需要根据场景调整建议。比如,如果图像质量高,传统方法足够;如果复杂背景或变形,可能需要深度学习。 还要考虑用户的技术水平。之前的代码示例较为基础,用户可能需要更详细的步骤或建议。可能需要补充预处理步骤的重要性,比如二值化、形态学操作,以及如何定位数字区域。 同时,用户可能遇到的问题,比如如何调整参数,如何处理多个数字,或者如何提高识别率。在回答中需要给出一些优化建议,比如使用轮廓检测或透视变换。 最后,总结推荐的方法,帮助用户根据具体情况选择。同时提醒Tesseract的局限性,可能需要进行训练或调整配置,而深度学习虽然准确但需要数据和训练时间。 需要确保回答结构清晰,分点说明,语言简洁,同时覆盖库、算法、步骤、优化建议等方面,满足用户的不同可能需求。</think>以下是针对七段数码管数字识别的Python解决方案及算法详解: --- ### 一、常用算法原理 1. **传统图像处理法**(推荐基础使用) - 核心步骤:$二值化 \rightarrow 形态学处理 \rightarrow 区域定位 \rightarrow 段检测$ - 数学基础:通过$M_{n×m}$像素矩阵的布尔运算判断各段状态 - 优势:无需训练数据,实时性好 2. **特征匹配法** - 使用$HOG(方向梯度直方图)$提取特征 - 通过$SVM(支持向量机)$进行分类 3. **深度学习法**(推荐复杂场景) - 使用$CNN(卷积神经网络)$端到端识别 - 常用网络:$LeNet-5$, $MobileNetV3$ --- ### 二、可用Python库 #### 1. 图像处理基础库 ```python import cv2 # 核心图像处理 import numpy as np # 矩阵运算 ``` #### 2. 专用识别工具 - **Tesseract OCR**(需额外配置) ```python import pytesseract pytesseract.image_to_string(img, config='--psm 10 digits') # 单字符识别模式 ``` *需添加自定义字库训练* - **Scikit-image** ```python from skimage import morphology, feature ``` #### 3. 机器学习框架 ```python from tensorflow.keras import models, layers # CNN实现 from sklearn.svm import SVC # 传统机器学习 ``` --- ### 三、完整实现步骤 #### 1. 传统方法实现流程 ```python def seven_segment_recognition(img_path): # 预处理 img = cv2.imread(img_path) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) _, thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU) # 定位数字区域 contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) x,y,w,h = cv2.boundingRect(max(contours, key=cv2.contourArea)) # 分割七段区域(需根据实际尺寸调整比例) segments = { 'a': (0.2*w, 0.05*h, 0.6*w, 0.1*h), # 上横 'b': (0.8*w, 0.15*h, 0.15*w, 0.3*h), # 右上竖 'g': (0.2*w, 0.45*h, 0.6*w, 0.1*h), # 中横 # ...其他段定义 } # 判断各段状态 active_segs = [] for name, (rx, ry, rw, rh) in segments.items(): x1 = int(x + rx) y1 = int(y + ry) roi = thresh[y1:y1+int(rh), x1:x1+int(rw)] if np.mean(roi) > 30: active_segs.append(name) # 数字映射(可扩展) digit_map = { '0': ['a','b','c','d','e','f'], # ...其他数字定义 } return next((k for k,v in digit_map.items() if set(v)==set(active_segs)), '?') ``` --- ### 四、优化建议 1. **形态学优化**: ```python kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (3,3)) cleaned = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel) ``` 2. **透视校正**: ```python # 使用cv2.findHomography()进行透视变换 ``` 3. **亮度自适应**: ```python clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8)) adaptive = clahe.apply(gray) ``` 4. **深度学习方案**(示例): ```python model = models.Sequential([ layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)), layers.MaxPooling2D((2,2)), layers.Flatten(), layers.Dense(10, activation='softmax') ]) ``` --- ### 五、推荐方案选择 | 场景特征 | 推荐方案 | 识别率预期 | |------------------------|-------------------------|------------| | 高对比度、单数字 | 传统图像处理法 | 85%-95% | | 多角度拍摄、复杂背景 | CNN深度学习模型 | 92%-98% | | 低分辨率图像 | HOG+SVM组合 | 80%-90% | --- ### 六、注意事项 1. 数码管类型差异: - 共阳/共阴接法会影响亮度表现 - 部分型号可能带有小数点段 2. 常见失败案例处理: ```python # 段缺损检测 if len(active_segs) < 4: return 'invalid' ``` 如需实现完整工业级解决方案,建议结合: 1. 多尺度滑动窗口检测 2. 数字序列校验机制 3. 基于光流法的动态识别(视频流处理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值