numpy(√) & Pandas & Scipy
首先奉出RUNoob。站在巨人的肩膀上~
- arrange:返回数组的列表,将其转化为numpy的数组,从0开始到给定数字结束的自然数
用法如:求列表每个元素的平方
np.arrange(n)**2,0-(n-1)的每个数字都求平方 - 两个数组a、b相加,直接使用a+b
- 核心对象:array数组,元素的类型必须是同一个。数组使用[]
- array的属性:
shape:m*n的数组
ndim:维度的数目,行数
size:所有数据元素的数目
dtype:元素类型 - 创建数组:
python的列表list和嵌套列表创建array
numpy形式:arrange、ones/ones_like(数组全为1)、zeros/zeros_like(数组全为0)、empty/empty_like(权威空)、ful/full_like(指定数值)、eye(单位矩阵)
生成随机数的np.random模块构建 - array支持的操作函数
逐元素的加减乘除
面向多维的数组索引
聚合函数:sum/mean
线性代数函数:求逆矩阵、求解方程组 - arrange语法:np.arrange([start,]stop[,step],dtype=None),开始数字、结束数字(不包含)、步长
ones语法:np.ones(shape,dtype=None,order=‘C’),shaoe可以是一个数:2,可以是一个元祖:(2,3),表示多维向量
ones_like语法:ones_like(a,dtype=float,order=‘C’),其中a是np.array,该语句用于创建与a相同的形状的全是1的数组
zeros、zeros_like、empty/empty_like同ones、ones_like
full语法:np.full(shape,fill_value,dtype=None,order=‘C’),其中full_value是填充数字,shape一个是数字、可以是元祖
full_like同其他like
random语法:np.random.randn(d0,d1…dn),d0…dn分别表示:行,列,块…具体数字表示几行、几列、几块… - reshape(n,m):将数组重塑为n*m的矩阵
- 加减乘、sin、exp、argsort
加: 数组+num/数组:每个数字加num/数组
减: 数组-num/数组:每个数字减num/数组
乘: 数组*num:每个数字乘num
sin:np.sin(数组),对每个元素求sin
exp:np.exp(数组),e的数组中每个元素的次方
argsort:arr.argsort(),对数组进行排序 - 按索引查询,索引类型:基础索引、神奇索引、布尔索引
基础索引:
一维数组:下标index;用冒号的切片(-1代表最后一个,依此类推-2代表倒数第二个,0代表第一个,切片结果不包含最后一个数字的位置),
二维数组:下标[x,y];切片[x:y,z:w],其中数组可以省略
神奇索引:使用数字列表取想要获得的列或行,如x[[2,3,4]]取2、3、4行的所有列,x[:,[2,3,4]]为取2、3、4列的所有行;同时指定行和列的时候定位到指定元素,所输出为一个一维数组。
布尔索引:arr>num:返回数组中每个数字是否大于num,返回值为一组true+false。使用arr[arr>num]可以筛选大于num的数字;其他使用arr[arr>num]=0、arr[arr<=num]=1,可以实现数据的标注;还可以使用自增降 :x[x<num]+=20;条件组合查询(每个条件都要加小括号):(x%2==0)| (x>7) - numpy的随机函数
randint中size可以是一维:size(5,),可以是多维:size(2,3,4),维数使用元祖形式表示
choice的a是数组的时候,所生成元素全部来源于a
shuffle应用于二维数组的时候,只会将行的位置交换,行内元素不变化
permutation会更改原来arr,会返回一个新的copy
uniform:均匀分布
随机数可以用于加入噪声。
- np.linspace(-10,10,100),开始数字:-10,结束数字:10,数字个数:100
- 数学统计函数:
函数 | 描述 |
---|---|
sum | |
prod | 所有元素的乘积 |
cumsum | 从该元素向前加,跨行 |
cumprod | 从该元素向前乘,跨行 |
min、 | |
max、 | |
percentile | 0-100百分位数;eg:np.per。centile(arr,[25,50,75])分别取25%、50%、75%的数字 |
quantile | 0-1分位数;eg:np.quantile(arr,[0.25,0.50,0.75])分别取25%、50%、75%的数字 |
median | 中位数 |
average | 加权平均,参数可以指定weights:np.average(arr,weights=np.random.rand(*arr.shape)),权重矩阵的shape需要和arr相同 |
mean | |
std | |
var |
- 轴:axis=0:行,axis=1:列
当使用sum/mean/media等聚合函数时,axis=0代表把行消解掉(跨行计算),axis=1代表吧列消解掉(跨列计算),此处同pandas - 标准化:同pandas,(A-np.mean(A,axis=0))/np.std(A,axis=0)
- 广播:矩阵A-B,B的维数(如只有1行)与A不相同,将B的行数复制为同A相同的行数
- 挑选符合条件的数字,直接使用数组跟数字进行比较,语法:arr[arr>num]
- 一维数字升维
方法:np.newaxis,newaxis是关键字,使用索引的语法给数组添加维度,默认为none。需要添加行维度,语法:arr[np.newaxis,:];添加一个列维度,语法:arr[:,np.newaxis]
np.expand_dims(arr,axis):方法,同上方功效,给arr再axis位置添加维度,axis=0为行,axis=1为列,语法:np.expand_dims(arr,axis=0),相当于上方在行写一个np.newaxis
np.reshape(a,newshape):方法,给一个维度(newshape中行的位置或列的位置)设置为1完成升维.。另一个维度长度未知时使用:-1,让numpy自己算出共多少维 - 数据合并:添加行(样本数据),添加列(特征)
方法:np.concatenate(array_list,axis=0/1),沿着制定axis进行数组合并
np.vstack或者np.row_stack(array_list):垂直vertically,按行row wise进行数据合并
np.hstack或者np.comlumn_stack(array_list):水平horizontally、按列conlumn wise进行数据合并
其中:添加新行:np.concatenate(array1,arr2) 和np.vstack(arr1,arr2)np.row_stack(array1,arr2)效果相同。
添加新列:np.concatenate(array1,arr2,axis=1) 和np.hstack(arr1,arr2)np.column_stack(array1,arr2)效果相同。 - 逆矩阵求解线性方程组
逆矩阵:np.linalg.inv(arr)
矩阵乘法:A@B 或 np.matmul(A,B) - 结构化数组: 相当于数据库中定义数据的类型,或c语言中的结构体
如,存储学生姓名、年龄、体重的二维表格
复合结构:new_dtype = np.dtype([(‘name’,‘U10’),(‘age’,‘i4’),(‘weight’,‘f8’)]),其中U=unicode,i=int,f=float
赋值:arr=np.array([(‘ming’,30,55.2),(‘gang’,20,56),(‘li’,32,67)],dtype=new_dtype),两个参数,一个是数组,一个是类型。
若使用切片或下标进行寻找,返回数据以一组数据为一条进行返回。
当使用索引名字(如name)进行寻找,则返回索引名对应的所有数据。
当使用条件进行查询,eg:arr[arr[“age”]>20],组合条件进行查询:arr[(arr[“age”]>20) &(arr[“weight”]>80) ]
对逐列进行计算:arr[“age”]+=1,每个age都会加1 - numpy与pandas的相互转化
numpy---->pandas
pd.Series(arr)将numpy的arr转化为pandas的series(series每个数据都对应一个索引)
pd.DataFrame(arr,columns=[“columnName1”,“columnName2”,“columnName3”,…])
pandas---->numpy
series.values 或 series.to_numpy()
df.values 或 df.to_numpy() 数据是经过处理后的 - numpy+sklearn(传统机器学习)
import numpy as np
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.llinear_model import LinearRegression
#导入数据
data,target = datasets.load_boston(return_X_y=True)
#分割训练集,验证集
x_train,x_test,y_train,y_test = train_test_split(data,target)
#训练线性回归模型
#构造线性回归对象
clf = LinearRegression()
#执行训练
clf.fit(x_train,y_train)
#在训练集上打分
clf.score(x_train,y_train)
#评估模型和使用模型
#在测试集上打分
clf.score(x_test,y_test)
#使用测试集进行预估
clf.predict(x_test)