一些没什么用的python脚本碎片整理
前言
岁数大了,知识又学杂了,再加上阳了以后,总感觉记性不好,特来整理一些没什么用的python脚本片段snippet。大概包含
一、二维数组切片、
list中字符串转float/int、
txt删除空行、
初始化x坐标,从1-100等、
plt在同一张图上画多个折线图
不定期更新吧。
等更新到一定数量会放在github上~欢迎收藏
代码
废话不多说,直接上代码
python数组切片(一维和二维)
切片规则:对于一维array或者list a, 切片规则为sliced_a = a[start : stop: step]
1234import numpy as npa = np.array([1,2,3,4,5,6,7,8])sliced_a = a[1::2] # 省略stop就是到末尾print(sliced_a) # [2 4 6 8]
对于二维数组,和一维相似,只不过多个维度而已,来,看例子
1234import numpy as npa = np.array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]])sliced_a = a[0::3, ...
KNN(K近邻)和K-means(聚类)的区别
前言
嗐,知识学多都学杂了,最近总是搞混这两个算法。今天终于有时间来整理一下。
算法简介
KNN(K-Nearest Neighbor)是机器学习中的分类算法,它将距离相近的样本点分为同一类,KNN 中的K指的是近邻个数,也就是最近的K个点,根据它距离最近的K个点的类别来判断属于哪个类别。KNN是有标签的
人以群分,物语类聚;近朱者赤,近墨者黑 是 KNN 的核心思想。这其实和我们在日常生活中评价一个人是一样的,如果你想要知道一个人是什么样的,那就去找和他关系好的几个人看看对他的评价or看和他关系好的人是什么样子的,就可以大致判断出他是什么样的人了。
而K-means聚类当属无监督聚类算法中最经典的算法 。该算法的主要作用是将相似的样本自动归到一个类别中
算法思想
话不多说,直接上算法思想
KNN的算法思想:
计算测试数据与各个样本数据之间的距离,通常为欧式距离;
按照距离的递增关系进行排序;
选取距离最小的K个点;(即最近的K个点)
确定前K个点所在类别的出现频率;
返回前K个点中出现频率最高的类别作为测试数据的预测分类。
优点:简单,易于理解,易于实现,无需估计参数。对数据没有 ...
python捕获日志之loguru
为了保留异常或错误信息,通常会用日志的方式来进行记录。loguru 库的使用可以说是十分简单,希望大家可以使用炫酷的loguru来代替print。
安装
1pip install loguru
简单使用
123456from loguru import logger logger.debug("debug message")logger.info("info level message")logger.warning("warning level message")logger.critical("critical level message")
按照日志的严重情况可以打印出不同的颜色。
使用add()方法配置logger
12345logger.add("test.log", rotation="10 MB") # 文件大于10M会重新生成一个文件logger.add("test.log", rotation="00:00&q ...
python for循环并行,单卡多卡并行解决办法
前言
当你显存足够,想用空间换时间;或者想单纯的加速模型。正好用的是python的for循环,而且每一次循环都是一次模型的推理过程,那么本 blog内容将非常适合你。
单卡并行
现在并行的方法有很多,本文没有对现有的方法进行归类,但是找到了适合自己用的,就分享在这里。比如:
1234567891011from concurrent.futures.thread import ThreadPoolExecutordef job(a, b): return a+bdef parallel_run(input_dir, a, b, num_worker): thread_pool = ThreadPoolExecutor(max_workers=num_worker) print('Thread Pool is created!') for i in range(len(input_dir)): thread_pool.submit(job, a, b) thread_pool.shutdown(wait=True)
再比如异步执行: ...
Linux下定时执行任务crontab
前言
作为一个linux深度爱好者,当你使用python或者shell时,能估计好运行时间,想让程序运行完以后,换个参数继续运行,这个时候你就可以去睡觉或者出去玩了~如果能定时执行,是不是很灵性的操作
crontab命令简介
Linux crontab 是用来定期执行程序的命令。当安装完成操作系统之后,默认便会启动此任务调度命令。
crond 命令每分钟会定期检查是否有要执行的工作,如果有要执行的工作便会自动执行该工作。注意:新创建的 cron 任务,不会马上执行,至少要过 2 分钟后才可以,当然你可以重启 cron 来马上执行
使用方式
12crontab -e # 编辑cron任务# 你会看到下面的注释,把这些都删了,输入你要执行的指令
123456789101112131415161718# Edit this file to introduce tasks to be run by cron.# # Each task to run has to be defined through a single line# indicating with different field ...
解决Ubuntu显示时间不正确
背景
在使用loguru打印日志命名时,通常会使用系统时间;在安装完Ubuntu系统后,尤其是服务器,也会看时间,发现时间对不上
一般来说,两种情况:
时区正确,系统本身时间不正确
时区不正确
下面看解决办法
时区正确,系统本身时间不正确
1234# 查看时区date -R# Fri, 18 Nov 2022 13:31:12 +0800# 后面的 +0800 即为咱们的东八区,不是这个就不正确,需要修改系统时间,同步一下网络时间即可
1234# 安装ntpdate工具sudo apt-get install ntpdate# 同步网络时间sudo ntpdate cn.pool.ntp.org
时区不正确
重新设置时区即可
123456# 运行timezone select,会出现文本交互界面,# 选择Asia-->China-->Beijing-->Yes即可。选择过程中输入文本前面对应的数字sudo tzselect# 复制文件到/etc/localtime下sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/lo ...
python软件许可License文件生成
完成软件开发后,将软件给到用户使用,但是你只希望给固定的用户或固定的电脑使用,这时license就上场了,本文介绍license的生成与调用。
前言
MAC地址是计算机的物理地址,它一般由网卡设备决定,用来表示互联网上不同的站点相关的标识符,而且每一台计算机都拥有不同的物理地址。MAC地址由计算机的网卡决定,而且它是固定的,一般不会被更改。因此将电脑的mac地址是作为电脑的标识。
获取mac地址后,通过一套加密算法将地址生成license,并给出license失效时间。然后每次运行软件前,需读取license进行解密,并与当前电脑的mac地址对比。如果相等,则授权成功,成功运行软件;否则授权失败。
实现方式
使用hash算法对mac地址加密,hash算法的特点是正向快速、逆向困难、输入敏感、冲突避免
。
加密过程
123456789# 首先获取license字典,包含mac地址,license失效时间,和mac加密结果psw = Utils().hash_msg('jerry' + str(self.mac_addr)) # 将mac地址加个字符串进行编译,增加破 ...
python@staticmethod@classmethod@property介绍与使用
Python面向对象编程中,类中定义的方法可以是 @classmethod 装饰的类方法,也可以是 @staticmethod 装饰的静态方法,用的最多的还是不带装饰器的实例方法。那我们该如何区分使用它们呢?
介绍
12345678910111213141516class A(object): def m1(self, n): print("self:", self) @classmethod def m2(cls, n): print("cls:", cls) @staticmethod def m3(n): print('111')a = A()a.m1(1) # self: <__main__.A object at 0x000001E596E41A90>A.m2(1) # cls: <class '__main__.A'>A.m3(1) # 111
类中共定义了3个方法,m1 是实例方法,第一个参数必须是 ...
Python封装wheel并上传pypi(可通过pip安装)
当你看到这篇文章的时候,说明你已经在python领域有所涉猎,已经不是当初的那个小白了。直接进入正题!本文做初次使用记录,随时更新
建立包结构
比如:我们想封装一个切图的功能,存放方式
12345project ├──slice ├──__init__.py ├──img_slice.py ├──setup.py
包也可以有多层结构:
1234567project ├──slice ├──__init__.py ├──img_slice.py ├──utils ├──__init__.py ├──setup.py
将以上slice包移动到你需要的conda虚拟环境envs下,找到python的根site_packages文件夹内,然后就可以直接使用import导入以上包或者指定模块,python会按照包和模块搜索路径完成加载
上面这种方式和后面的安装本地wheel和pip安装原理是一样的
封装wheel
完善setup.py信息,里边包含了你要封装的wheel的所有信息
123 ...
JPG的压缩原理
JPG有损压缩知识点整理(待完善)
查阅资料:jpeg的压缩算法包括以下5个步骤:
图像分割成8*8的小块,压缩过程是每个小块单独处理的
颜色空间转换RGB->YCbCr
离散余弦变换DCT
数据量化
Huffman编码
代码已经复现,但是从步骤2开始就已经不是模型可以推理的格式了,步骤2-5是在遍历步骤1中每个8*8的小块中进行的,输出的结果是str类型,所以不能推理。
python代码实现
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413 ...
python中lambda函数的用法介绍
又称匿名函数lambda:是指一类无需定义标识符(函数名)的函数或子程序。
lambda 函数可以接收任意多个参数 (包括可选参数) 并且返回单个表达式的值。
语法:
1lambda [arg1 [,arg2,.....argn]]:expression
args:函数将接收的参数
expression:结果为函数返回值的表达式
冒号前是参数,可以有多个,用逗号隔开,冒号右边的为表达式(只能为一个)。其实lambda返回值是一个函数的地址,也就是函数对象。
举例:将lambda函数赋值给一个变量,通过这个变量间接调用该lambda函数
12345678def sum(x,y): return x+yprint(sum(1,2))# 使用lambda函数:sum = lambda x,y : x+yprint(sum(1,2))# 没有了函数sum的定义,又称为匿名函数
由于它的简单性,lambda 函数可以使Python 代码在某些场景中更优雅。下面是Python 中 lambda 函数的5个常见用法。
命名使用
123456789lambda_add_ten = lambd ...
python中copy和deepcopy详解
python中标识一个对象唯一身份的是:对象的id(内存地址),对象类型,对象值。
deepcopy是真正意义上的复制,深拷贝,被复制对象完全复制一遍作为独立的新个体,新开辟一块空间。
浅拷贝,不会产生独立对象,等于赋值,只是对原有数据块打上新标签,其中一个标签改变,数据块就会变化。浅拷贝等于赋值,也可以通过copy实现,copy仅拷贝对象本身,浅拷贝不会对其中的子对象进行拷贝,如果对子对象进行修改,拷贝结果也会随着修改。
复制的对象中无复杂子对象,即列表中不嵌套列表,原来值的改变并不会影响浅复制的值,同时浅复制的值改变也并不会影响原来的值。原来值的id值与浅复制原来的值不同。
复制的对象中有复杂子对象 (例如列表中的一个子元素是一个列表)如果改变复杂子对象的值(列表中的值)会影响浅复制的值。
12345678910111213141516171819202122232425262728293031import copya = [1,2,3,[4,5],1]b = ac = copy.copy(a)d = copy.deepcopy(a)a.append(9)a[3].append ...