Python3机器学习工具包基础复习
Python3进阶复习:Python3进阶复习_でこもり さなえ的博客-CSDN博客
机器学习四剑客:numpy、pandas、matplotlib.pyplot、PIL
实际上感觉 sklearn 也十分重要,但是没有被算进去
numpy
import numpy as np
容器类型 numpy.ndarray
python的这些工具包的参数对类型检查比较弱,好多参数类型要求都是 object,只要形式正确就行,比方说下面几个函数,你传列表可以,元组也可以,甚至混着来的元组列表互相嵌套都可以,然后还有些是 *args 可变参数,本质是元组,你传元组也可以,传不定个普通类型参数也可以,因为 *args 传元组可以,于是传列表也可以,毕竟元组是列表的劣化,它内部将 *args 视作元组只用元组的功能,实际上用的是你传进去的列表,但这并没所谓,毕竟元组有的列表都有,而其结果就是完全能用。
然后再就是这些工具包里的函数一般都是比较正常的变化都体现在返回值里,基本上没有对参数进行直接操作的,python标准库里有一些那种离谱的,直接改变参数
函数功能大致记得就行,具体参数形式如果记不住就现查文档。
数组的创建:
a = np.array([1,2,3], dtype=None) 列表创建数组,可以具体指定 dtype,比如 np.int32,np.int64,np.float64,默认None为自动识别
a = np.arange(1,4,1) 类似range方法创建数组
一定要注意的是:向量是二维数组,不是一维,一维数组 (n,) 不是向量,二维数组 (n,1) 或者 (1,n) 这才是向量,或者你可以理解成向量是特殊的矩阵,二维数组才是矩阵,所以该reshape 的时候一定要记得 reshape
a.reshape( [1,3] ) 返回 a reshape成 1 行 3 列后的数组
然后关于数据类型,也是可以后改的,但得保证能改,能够强制类型转换,比方说字符串转int,那就不一定能行,这个是数学python基础篇的内容,具体的函数是
a.astype(dtype)
数组的属性:
a.ndim 数组 a 维度,几维数组
a.shape 数组 a 形状,返回一个元组,表示每维多长
a.size 矩阵 a 元素个数
a.dtype 矩阵 a 元素数据类型
矩阵的基础运算
标量运算:
a1+a2
a1-a2
a1*a2
a1//a2
a1/a2
a1%a2
a1**a2
全都可以,只要数据类型支持就可以(字符串矩阵你还除法、取模啥的那就不正常了),是对应位置的运算
其中 a2 可以是常数,也可以是维度对应的向量作批量标量运算
比方说 a2 是个列向量,和 a1 行数相等,那么 a1*a2 就是 a1 的每一行对应标量乘 a2 的那一行的那个标量常数
举例如下:
然后比较有意思的运算是
a1 > a2 ,a1 < a2 等等,整体比较,返回 True False 的数组
这是 list 所不具备的,在 DataFrame 的数据筛选中十分好用
矩阵乘法:
a1@a2
需要注意的是,这些工具包里,一般都会有冗余的用法
比方说
np.multiply(a1,a2) 也是标量乘
再比方说
np.matmul(a1,a2) np.dot(a1,a2) a1.dot(a2) 都是矩阵乘
功能都是完全一样的,也就dot有点小区别,可以对一维数组作向量内积,这没意义,向量我肯定推荐规范写法reshape成二维,一维数组根本不能算作向量的
所以挑自己最喜欢的写法来用就好,我推荐用运算符
矩阵转置:
a.T 我推荐用这个属性,比较简洁,老方法是 a.transpose()
a.flatten() 数组 a 降成一维
其他创建矩阵的方式:
np.zeros(shape,dtype) 全 0 矩阵,默认浮点数
np.ones(shape,dtype) 全 1 矩阵,默认浮点数
np.eye(n,m=None,k=0,dtype) 线代的 E/I,对角线全 1 的矩阵,只给 n 就是方阵,可指定非方阵 n,m,k指定在第 k 列开始的对角线全1,默认0即主对角线,默认浮点数
其他计算:
np.sum(a,axis=None,dtype=None) 求和,对于 axis 参数,默认 axis=None 表示对矩阵内所有数求和返回一个数,axis=0表示对每一列求和,返回一维数组,axis=1表示对每一行求和,返回一维数组。参数 dtype 指定返回值的数据类型,默认按 a 的类型来
np.mean(a,axis=None,dtype=None) 均值,参数axis同上,参数dtype指定返回值的数据类型,默认为浮点数
np.median(a,axis=None) 中位数,参数axis同上,返回浮点数,偶数个则中间两个取均值
np.max(a,axis=None) 最大值,参数axis同上
np.min(a,axis=None) 最小值,参数axis同上
np.argmax(a,axis=None) 最大值所在下标,参数axis同上,None的时候相当于 flatten 后的下标,如果有多个最大值返回的是第一个位置的下标
np.argmin(a,axis=None) 同上最小值所在下标
np.nonzero(a) 返回a去0后的flatten后的一维数组
np.count_nonzero(a) 非0数的个数
np.linspace(start,stop,num=50) 得到数据范围 [start,stop] 的 num 个数构成的等差数列
众数怎么求呢
from scipy import stats
stats.mode(a)[0] 返回众数数组
数组的索引与切片:
和列表基本一样,可以用 [ ] 索引,: 指定切片范围
区别在于多维列表,比如二维你只能 lis[xxx][yyy]
但是数组可以一个中括号里用逗号区分维度,比如 a[ xxx, yyy ]
关于插入和删除:
不可删除
不能插入,但是可以赋值,长度必须对应,类型如不能隐式转换则必须对应
如有插入删除等需求,可以先转换成 list
数组转列表
a.tolist()
请不要用 list(a) 强制类型转换,强制转n维数组只能转出1维含n-1维数组的列表
pandas
import pandas as pd
pandas库下有 Series 和 DataFrame 两种数据结构
Series 类似于字典,DataFrame 相当于表,或者说相当于多个 Series 的合并,一列 index,多列value
具体模型如下
pd.Series
和 dict 的最大区别在于,pd.Series 允许索引 index 重复,可以理解成 C++的 multimap 允许键的重复
Series的创建方式:
1. 由列表或元组或数组创建(都能传,原因不再赘述)
ser = np.Series(a,index=None) 值是a,可用列表等来指定 index,默认None表示index=0,1,2,...
但这里有件很重要的事需要注意,np.ndarray 是一个类,对应的数组变量是一个对象,于是传数组等于传对象引用,ser改变了value,那么对应的数组内容也会变
所以不建议传数组,涉及传参问题对象一般都不建议传!
传 list 是完全可以的,请注意 list 不是常规的类。
这里再强调一次!请记住!Python 六大基本类型,三个数据类型,三个容器类型:
int、float、str、list、dict、set
请注意,python的六大基本类型都不是引用类型,不像其他语言容器都是引用类型。
2. 由 dict 创建
ser = np.Series(dic) 需要注意的是其实可以指定index,但是你不应该再指定 index,一个很重要的事情是:如果你指定的 index 和 dic.keys 不一样,那么最后创建的系列的value全都是NaN
如果用 dict 创建 Series,想要改 index,请一定先创建好后再改
修改索引:
ser.index = lis
修改数据类型:
ser.astype(dtype)
ser.values 值的一维数组
ser.index 索引列表,其实不是列表,类型是列表 Int64Index 等等这种对象
这里强调一次,以后不再讲,这些东西全部强制类型转换成 list 再去用
其他处理方法说不好就还会涉及引用的问题,千万不要给自己找麻烦
系列转列表:
list(ser) 得到的是值列表,就和 list(ser.values) 一样
系列转字典:
千万不要用 dict(ser),会出大问题
如果实在想转,就这样写,dict(zip(ser.index,list(ser))),这和转没啥关系了,相当于用两个列表创建一个字典了,是python基础篇中的内容,注意这样转后重复索引相当于更新,保留的是最后一个值
系列转数组:没啥可说的,转成列表后就无所不能了,先列表,后数组
基本运算:
+ - * / % ** 只要数据类型支持就可以,对所有 value 整体作运算
特别的,和数组相比,系列和系列之间的运算不用担心对齐问题,它会按索引把值对应相加,索引找不到对应的,也会保留这个索引,对应的value结果是NaN,对于重复索引,每一个都视作单独的,比方说索引 ser1 2个1,ser2 3个1,ser1+ser2对于索引1就是 2*3 种对应相加,示例如下:
需要注意的是 NaN 的类型是 np.float64,很多时候算完我们要自行调整类型
手动加nan的话就是 math.nan 或者 np.nan
其他运算:dot sum mean 啥的都有,但我建议用数组矩阵来做,看着舒服,规范性也更好
特别的 ser.mode() 返回众数
系列的索引与分片:
系列的索引与分片得到的结果有两种,取决于你分出了几个元素,只有一个则返回的是对应的单个value,有两个及以上,则返回的是Series类型,也就是分片结果
需要注意并不是单索引访问结果就是value,因为index可以重复,结果可能是Series分片
具体写法有以下三种:
①单个索引:比如 ser[ 'a' ]
②索引列表:比如 ser[ [ 'a','b','c' ] ]
③下标分片:ser[ start:end:step ],注意这个很特别,是暗藏的下标,从 0 开始
赋值修改:
会了索引分片,那也就回了赋值修改,就上面那三种方式
但有一点需要注意,关于重复索引问题
比如 a:1 a:2
那么 ser[a]=0 结果为 a:0 a:0
还可以 ser[a]=[10,100] 结果为 a:10 a:100
删除:注意,调函数不是直接对ser删除,是返回删除后的副本
注意,绝对不要使用 del,会出问题
ser.drop('a')
或者 ser.drop( [ 'a','b','c' ] ) 批量删除
需要注意的是重复索引的话就一块全删了,似乎没法挑一个删。想挑那就自己转成列表慢慢手动处理再转回来就好了,转成列表就无所不能了。
ser.dropna() 删除缺失值(NaN)行
ser.drop_duplicates() 删除完全冗余的行(索引和值都相等的行)
然后与 dropna 对应的是 fillna
增加:注意,调函数不是直接对ser增加,是返回增加后的副本,赋值增加当然是直接改
对于索引不存在的情况下,可以直接赋值增加
比如没有 100,那么 ser[100]=1000 就是增加了 100:1000
已经存在了就只能是修改,这样就不能增加重复元素
ser.append(ser2) 这样添加是允许重复元素的
关于名称的补充:
ser.index.name='xxxx' 这样就可以给索引改名了
ser.name='xxx' 这个是系列名,这个在初始化构造的时候可以指定,但index.name只能后改
要注意的是 DataFrame 的列名不等价于 Series 的系列名,但是 DataFrame 里取出的 Series 分片默认的系列名是对应的列名
pd.DataFrame
数据帧的创建:
①列表字典
字典每个元素的 key 是列名,值是一个列表,字典的一个元素就是 df 的一个列
例如 data={'id':[1,2,3],'name':['a','b','c']}
df = pd.DataFrame(data)
②已有数据帧
df_new = pd.DataFrame(df,index=[xxx],columns=[yyy])
指定的原本不存在的 index 和 columns,会将这些部分赋成 NaN
df_new 的 index 和 columns 顺序按指定的来
所以这个方法最主要的用途就是去掉不想要的索引或列,以及调换顺序
③ csv / tsv 文件
下面这个函数的参数非常多,仅列出几个常用的,有额外需要自行查文档
df=pd.read_csv( 'filepath' , sep=',' , header='infer' , names=None , index_col=None , dtype=None, encoding=None)
sep:分隔符,默认逗号,可指定成 \t 从而读 tsv 文件
header:传 int 表示取第几行作列名行,默认 'infer' 和 0 是一个效果,第 0 行视作列名行,传 None 表示不从文件获取列名行,此时使用的列明是 0,1,2,...
names:传列名列表来指定列名,默认 None,由 header 指定,手动指定时不能和 header 冲突,否则异常,多指定了那后面那些列的数据就是NaN,少指定了,则前面几列整体为MultiIndex
index_col:传 int 表示第几列作索引列,默认 None 表示自动判断,传 False 表示不从文件获取索引列,使用默认索引
dtype:不再解释了
encoding:文件解码方式,默认None就是utf-8
默认的列名及索引的选择策略:
默认第 0 行作列名行,当列名数和数据列数一致时,索引为默认的 0,1,2,...,当列名数小于数据列数时,多出来的列数将会使左侧几列一起成为 MultiIndex 索引类型。对于缺失问题,数据中的缺失,不管是少了逗号还是少了逗号后的内容,一律用NaN填充。列名行有逗号却没逗号后的内容,不认为少了一列列名,只认为列名的内容缺失,自动填充规则为 Unnamed:列号
关于插入和删除等:数据帧和系列的函数是一样的,drop、dropna、append等等
区别是可以指定 index 和 colomns,不再只是 index
然后一些基本运算也都有,比较好用的是 df.mode() 以一行为单位判断众数
更改索引值 df.index = [xxx]
更改索引名 df.index.name=xxx
更改列名 df.columns = [xxx]
一些用法:
df.head() 前五行
df.tail() 后五行
df.sample() 随机五行,参数包括权重、随机种子等等,这里就不具体说了
df.describe(include=None) 数据描述,包括数据条数、均值、标准差、最大最小值,四等分位点,可指定 include 为 all,还会多出 unique,top,freq,表示不同值个数,频数最大的值是什么,频数多少,需要注意,这三个只统计标称型数据,也就是字符串,对数值型返回的是NaN。
df.info() 数据信息,包括每列的非空数据条数,dtype类型等等
pd.concat( lis[df1,df2,...] ) 具体参数不讲了,这篇写的挺好pandas的使用(concat篇)_帅哥大叔的博客-CSDN博客_concat pandas
df.groupby('id')['xxx']
df.groupby('id'). min max sum mean median describe等等,和 sql 的 group by 是一个道理
还可以 agg([ 'min' , 'max' , ... ]) 这样取多列聚合
有意思的是 agg 还可以传函数,比如传 lambda 表达式进去,参数是分组,值是单个聚合值
需要注意的是 groupby 分组后对应的类型是 DataFrameGroupyBy,取一列就是SeriesGroupBy,其本质是,不管一个分组里有几行,它都是一个分组值对应一个 DataFrame 或 Series,agg聚合后回到 DataFrame 或 Series 类型。举个例子,比如 df.groupby('id').get_group(0) 就是取出 id=0 的分组的 DataFrame
于是乎,比方说对每个 id 分组返回对应的 name 是众数,就可以利用 agg,agg(lambda x:x.mode()[0]) 这样就OK了
df.transform(func) 传一个函数 func,和 agg 的要求类似
对于 DataFrameGroupyBy 和 SeriesGroupBy 它也有 transform 这个函数
这时候有意思的事情就来了
transform是给每个单元格赋值的,也就是给每个单元格赋值,参数是分组,通过分组操作得到单元格的值,返回的是一个和原df或ser格式对应的DataFrame或Series,transform(lambda x:x.mode()[0]),这样就是给每格赋成所在分组的自己的众数
索引分片与赋值:
下面的讲解我们以两个实例为例
首先要说的是,用什么赋值,列表、数组、系列、数据帧这些都可以用来赋值,对分片赋值,我推荐一律用列表就好
然后是,所有分片方式都是可读可写的,并且注意分出来的都是引用,对分片操作等价于对原 df 操作,所以如果你要修改分片且不影响原 df
请一定用 copy() 函数,这个我们前面没讲,但是基本所有模块都有这个函数,不再赘述
然后说一下几种分片方式:
一、df.id:
这是取单个列的懒人方法
问题是重名问题,一旦和属性/函数重名,那你就不能取了,比如 df.name
二、df [ ] 直接分片:
这个方法可以 选多行 或 选多列,但不能同时选几行几列
① 列名列表取列分片
例如 df [ 'id' ] 、 df [ [ 'id' ,'name'] ]
② 行号范围取行分片
需要注意的是,必须是带冒号的行号范围,不存在单个行号的用法,单个值认为是单个列名
例如 df [ 1:2 ] 、df[ 0:3:2 ]
③ 布尔数组取行分片
要哪行哪行就是 True,不要哪行哪行就是 False
举例如下:
根据这一特点,于是我们可以进行条件判断筛选我们想要的数据行
对于简单的筛选,我们还可以利用列表推导式一行完成我们的筛选需求
示例如下:
多列的判断怎么用列表推导式?很简单,多重 for 后置即可。
详见 Python3 进阶复习的列表推导式篇,这里就不再赘述了。
④ 标签索引范围闭区间
这个方法是索引是标签时独有的方法,同样需要注意的是只能是范围
可以指定int型的步长
示例如下:
三、df.loc [ ]
df.loc [ xxx , yyy ]
xxx/yyy 可以是:单标签/标签列表、标签范围闭区间、布尔数组
具体用法不再列举了,和上面直接切片写法差不多
如果行或列取全部,范围/列表不能不写,要放一个冒号在那
需要注意的是,和直接分片的区别是:(下面的方法和直接分片的区别也是这样)
① 直接分片不能同时对行列分片,而 loc 的中括号里用逗号连接,分别操作行列
② 直接分片有限制条件,比如索引是int,那就只能默认做行号范围分片,索引非int就只能默认做标签范围分片,而比如 loc 对 int 索引也是视作标签。再比如直接分片没有列名标签范围分片,但是 loc 就可以
③ 最后,最重要的,也是真正意义上的区别是,如果用切片为切片赋值,loc 等方法切片的赋值会自动将列名对应赋值,而直接切片是将位置对应赋值,示例如下:
首先,需要知道的是切片取得的列名的顺序不会影响原来 df 的列名的顺序,列名顺序怎么换,前面已经讲过了,用 df 来创建 df 的时候可以换位置,切片的赋值,我们可以做到的是,将列值交换,那么怎么写呢,看下面的例子
一个最正常的写法就是:
这个是用数组赋的,如果你想拿分片赋呢?
首先,可以确认的是,任何分片方法都是可以取出调换列后的分片
然后,接下来是赋值,前面我们所说的直接分片赋值的区别也就体现出来了
四、df.iloc [ ]
df.iloc [ xxx , yyy ]
xxx/yyy 可以是:单序号/序号标签列表、序号范围、布尔数组
五、df.at [ ]、df.iat [ ]
df.at [ x , y ]
df.iat [ x , y ]
取单元格,x/y,at 是两个单个标签,iat 是两个单个序号
matplotlib.pyplot
import matplotlib.pyplot as plt
一般就是看个代价函数、混淆矩阵啥的
专门做可视化才需要深入了解
其实专门做可视化现在一般都用 js 的 echarts 或者 python 的 pyecharts,反而这些老的方法不怎么用了
而且为了看效果的话其实用 seaborn 又简单又好看,我肯定推荐 seaborn 而不是 plt
plt 这里就不详细说了,具体写的时候想调什么现查文档也不麻烦
举个最简单的小例子放在这里吧
PIL
from PIL import Image
简单看一下,不具体讲了
Python3机器学习工具包基础复习相关推荐
- 掌财社:Python 机器学习工具包SKlearn的安装与使用
很多小伙伴在学习机器学习的时候会苦恼到底用什么进行学习.在看了大佬的介绍后可能会使用Keras或者pytorch直接进行学习,但实际上有优秀的机器学习工具包.没错,小编接下来要介绍的SKlearm就是 ...
- 【面试复习】Python基础复习
[面试复习]Python基础复习 前言 相信一些学习python的朋友找不到一些python的的朋友找不到相对应的python面经,所以博主就推荐大家可以去牛客上面看看哦,各种大厂面经和习题哦! 地址 ...
- 智能制造技术基础复习内容全
智能制造技术基础复习内容 第一章.概论 1.智能制造,人工智能P1 制造业是国民经济的主体,是立国之本.兴国之器.强国之基. 智能制造(IM):智能制造通常泛指智能制造技术和智能制造系统,它是现代制造 ...
- 大福利!Google机器学习零基础在线课程发布,免费!有中文版!
作者 | Leo 新的学习资源来了!刚刚,谷歌上线了人工智能学习网站 Learn with Google AI,并推出了机器学习在线课程,免费!而且还有中文版! 传送门: "机器学习速成课程 ...
- 小心!你下载的机器学习工具包可能是病毒:CuPy被掉包,官方一天后才发现
点击上方"视学算法",选择加"星标"或"置顶" 重磅干货,第一时间送达 晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI 小心! ...
- 江苏省专转本计算机教程,江苏省专转本计算机基础复习(含真题)教程.doc
江苏省专转本计算机基础 复习要点与历年真题2005年-2014年 2014.10 第一部分 复习要点 第一讲 信息技术---3 第二讲 计算机硬件------8 第三讲 计算机软件---------- ...
- 为什么用Go编写机器学习的基础架构,而不是Python?
2020-02-14 12:35:39 全文共2626字,预计学习时长8分钟 来源:blog.sina Python是机器学习项目中最流行的语言,这点是毋庸置疑的. 虽然像R语言.C++和Julia这 ...
- python3基础语法-Python3的一些基础语法介绍和理解
作者:心叶 时间:2018-04-23 22:18 此处长期维护一些对帮助快速使用python3的一些基础语法,方便日常算法练习使用. 控制语法 break 语句可以跳出 for 和 while 的循 ...
- 微软亚洲研究院开源分布式机器学习工具包
微软亚洲研究院开源分布式机器学习工具包 为了满足研究人员和开发者日益增长的各种需求,微软亚洲研究院于日前将分布式机器学习工具包(DMTK)通过Github开源.DMTK由一个服务于分布式机器学习的框架 ...
最新文章
- events.out.tfevents文件
- 麦肯锡:企业数字化转型不要被技术“绑架”
- Lispbox的简单配置
- 网络犯罪分子为何针对中小企业?—Vecloud微云
- 功率谱密度相关方法MATLAB实现
- kubernetes-Service
- springcloud使用restTemplate进行服务调用
- 阿里云盘今日公测:无论用户是否付费,未来都不会限速
- 非特定人语音识别,speaker-independent speech recognition,音标,读音,翻译,英文例句,英语词典...
- Codeforces Round #573 (Div. 2) C. Tokitsukaze and Discard Items
- 关于手机联系人的改进想法
- 华为NP课程笔记25-SDN简介
- 微信小程序页面的基本布局方法——flex布局
- 键盘鼠标录制哪个好用_美商海盗船Scimitar RGB Elite鼠标体验:再多技能也怕这把弯刀...
- 渗透测试利器-打造全能VPS
- jQuery 选择器 选取第一个 p 元素
- Vivo(IQOO)无法输出调试日志解决办法
- oracle表独立数据文件,oracle表空间及数据文件
- CSS: text-decoration
- C#窗体应用 socket通信(一)
热门文章
- jquery 左右移动 以及使用layer.js弹出框呈现在页面上
- 嵌入式linux加载引导内核和根文件系统的方法
- JavaScript 工作必知(九)function 说起 闭包问题
- C++ string 用法详解(转)
- Python3入门(三)——Python基础语法
- bzoj 2648: SJY摆棋子2716: [Violet 3]天使玩偶 --kdtree
- 第一次作业--四则运算
- C# datagridview 删除行(转 学会、放弃博客)
- (转)EXCEL2007存储格式xlsx
- 金笛MODEM池 (RS232串口和RJ45网口)