(九)python语法之机器学习 1.numpy 2.pandas 3.matplotlib

创建

import numpy as np

print(np.array([1,2,3], dtype=np.float32)) 
# [1. 2. 3.]
print(np.arange(3))        
# [0 1 2]

print(np.linspace(1,10,4)) 
# [1. 4. 7. 10.] 间距=(10-1)/(4-1)
print(np.linspace(1,10,4, endpoint=False)) 
# [1. 3.25 5.5 7.75] 间距=(10-1)/4

np.ones((3,3))     # 3x3元素全为1.的矩阵
np.zeros((3,3))    # 3x3元素全为0.的矩阵
np.full((3,3), 2)  # 3x3元素全为2的矩阵
np.eye(3)          # 3x3单位矩阵 

a = np.arange(12).reshape(3,4) 
np.ones_like(a)    # 3x4元素全为1的矩阵
np.zeros_like(a)   # 3x4元素全为0的矩阵
np.full_like(a, 2) # 3x4元素全为2的矩阵  

np.random.seed(10) # 随机数种子
np.random.random() # 产生随机数

# 由[10,20)的随机整数构成的4x4矩阵
np.random.randint(10,20,(4,4)) 
# 4x4服从0~1均匀分布的随机矩阵
np.random.rand(4,4)  
# 4x4服从标准正态分布的随机矩阵
np.random.randn(4,4)     
# 从[0,10)均匀取值的4x4随机矩阵
np.random.uniform(0,10,(4,4)) 
# 4x4服从均值为2标准差为3的正态分布的随机矩阵
np.random.normal(2,3,(4,4)) 
# 4x4服从lambda为2的泊松分布的随机矩阵
np.random.poisson(2,(4,4))  

# 从一维数组a中以概率p抽取3x3的元素,replace表示是否可以重用元素
a = np.arange(10)
print(np.random.choice(a,(3,3),replace=False,p=a/np.sum(a)))

# 就地打乱数组,随机交换行
a = np.arange(12).reshape(3,4) 
np.random.shuffle(a)         
print(a)   

# 打乱数组,生成新数组
a = np.arange(12).reshape(3,4)
b = np.random.permutation(a) 
print(b)

属性

import numpy as np

a = np.arange(12).reshape(3,4) 
print(a.shape)    # (3, 4)
print(a.dtype)    # int32
print(a.ndim)     # 2 维度的数量
print(a.size)     # 12 元素个数
print(a.itemsize) # 4 元素的字节大小
print(a.mean())   # 5.5 所有元素平均值

print(a.sum())       # 66 所有元素的和
print(a.sum(axis=1)) # 1轴求和 [6 22 38]
print(a.sum(axis=0)) # 0轴求和 [12 15 18 21]

a.argsort(axis=0) # 3x4 0轴排序后的索引
a.argmax(axis=0)  # 1x4 0轴最大值的索引

a[1:4:2] # 0维取第1行 起始:终止:步长
a[:,1]   # 0维取全部,一维取第1列
a[:,1:3] # 0维取全部,一维取第1、2列
    
a.astype(np.float) # 修改元素类型
a.tolist()         # 将数组转化为列表
a.flatten()        # 展开成一维数组
a.reshape((4,3))   # reshape成4x3矩阵
a.swapaxes(0,1)    # 维度调换

操作

#1 根据布尔值掩码改变元素
a = np.array([1,2,3,4,5], dtype=np.int)
a[a < 3] = 0   
print(a) 
# [0 0 3 4 5]

#2 去重并按顺序返回一维数组
print(np.unique([1, 2, 2, 5, 3, 4, 3]))
# [1 2 3 4 5]

#3 边界裁剪(设定最小为3,最大为8)
a = np.array([1,2,3,5,6,7,8,9])
print(np.clip(a, 3, 8))  
# array([3, 3, 3, 5, 6, 7, 8, 8])

#4 np.where()
#  满足条件返回a,不满足返回0
a = np.array([1, 2, 3, 4, 5])
print(np.where(a < 3, a, 0)) 
#  [1 2 0 0 0]
# 返回满足条件的索引
print(np.where(a < 3))       
# (array([0, 1], dtype=int64),)

#5 np.nonzero()返回非0值的索引
print(np.nonzero([0,1,2,3]))  
# (array([1, 2, 3], dtype=int64),)

#6 连接
a = np.array([[1, 2], 
              [3, 4]])
b = np.array([[5, 6]])   
print(np.concatenate((a, b), axis=0))
# [[1 2]
#  [3 4]
#  [5 6]]
  
#7 堆叠
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(np.stack((a, b), axis=0)) 
# [[1 2 3]
#  [4 5 6]]
print(np.stack((a, b), axis=1)) 
# [[1 4]
#  [2 5]
#  [3 6]]

#8 np.tile()整体重复
#  [0,0]横向重复5次
print(np.tile([0,0],5))        
# [0 0 0 0 0 0 0 0 0 0]
# [0,0]先竖向重复5次,再横向重复两次
print(np.tile([0,0],(5,2)))    
# [[0 0 0 0]
#  [0 0 0 0]
#  [0 0 0 0]
#  [0 0 0 0]
#  [0 0 0 0]]

#9 np.repeat()单独重复
a = np.array([[1,2],
              [3,4]])
print(np.repeat(a, 3, axis=1))
# [[1 1 1 2 2 2]
#  [3 3 3 4 4 4]]

#10 np.pad()填充
# 前面填充1位0 后面填充2位2
a = np.array([1, 1, 1])
b = np.pad(a,(1,2),'constant', constant_values=(0,2)) 
print(b) 
# [0 1 1 1 2 2] 

# 先在行上填充一行0、行下填充一行3,再在列左填充两列0、列右填充两列3
a = np.array([[1,1],
              [2,2]])
b = np.pad(a,((1,1),(2,2)),'constant', constant_values=(0,3)) 
print(b)
# [[0 0 0 0 3 3]
#  [0 0 1 1 3 3]
#  [0 0 2 2 3 3]
#  [0 0 3 3 3 3]]
    
#11 旋转
mat = np.arange(9).reshape(3,3)
print(mat)
print(np.rot90(mat, 1)) # 逆时针旋转90度
print(np.rot90(mat, 2)) # 逆时针旋转180度

#12 生成网格
x = np.array([0, 1, 2])
y = np.array([0, 1])
X, Y = np.meshgrid(x, y)
print(X)
print(Y)

数学

import numpy as np

np.abs(-1), np.fabs(-1)
np.sqrt(4), np.square(2)
np.ceil(4.5), np.floor(4.5)
np.exp(0) 
np.log(np.e), np.log10(10), np.log2(2)
np.cos(0), np.sin(0), np.tan(0)
np.cosh(0), np.sinh(0), np.tanh(0)

print(np.sign(2))   # 1 符号函数  
print(np.rint(4.6)) # 5.0 四舍五入
print(np.mod(5, 2)) # 1 取余
print(np.modf(4.6)) # 返回小数和整数
print(np.copysign(3, -6)) # -3.0 拷贝符号
print(np.gradient([1,3,6,10])) 
# [2. 2.5 3.5 4.] 梯度计算 

print(np.logical_and(1, 0)) # False 
print(np.logical_or(1, 0))  # True  
print(np.logical_not(1))    # False 

print(np.maximum(1, 3))         # 3 
print(np.minimum([1,4], [2,3])) # [1 3] 

a = np.arange(6) 
np.min(a)            # 最小值
np.max(a)            # 最大值
np.argmin(a)         # 最小值的下标
np.argmax(a)         # 最大值的下标
np.sum(a,axis=None)  # 求和
np.mean(a,axis=None) # 均值
np.median(a)         # 中位数
np.std(a,axis=None)  # 标准差
np.var(a,axis=None)  # 方差
np.ptp(a)            # 最大值-最小值 
np.corrcoef(a, a)    # 相关系数

矩阵

import numpy as np

a = np.random.randn(3,3)
m = np.mat(a) # 将数组转化为numpy.matrix
print(m.A)    # 将矩阵转换为数组
print(m.T)    # 矩阵转置           
print(m.I)    # 求逆矩阵

print(np.linalg.det(m))     # 求行列式 
print(np.linalg.eigvals(m)) # 求特征值

# 求解 mx = v
v = np.random.randn(3)      
x = np.linalg.solve(m,v)  
print(x)

存储

import numpy as np

# csv形式的保存和加载
a = np.arange(12).reshape(3,4)
np.savetxt('np.csv',a,fmt='%d',delimiter=',')       
b = np.loadtxt('np.csv',dtype=np.int,delimiter=',') 
print(b)

# 多维数据的存储
a = np.arange(24).reshape(2,3,4)
a.tofile('np.dat',sep=',',format='%d') 
b = np.fromfile('np.dat',dtype=np.int,sep=',')
b = b.reshape(2,3,4) 
print(b)

# 快捷存储
a = np.arange(24).reshape(2,3,4)
np.save('np.npy',a)
b = np.load('np.npy')
print(b)

2.pandas

Series

# 带标签的一维数组

import pandas as pd
import numpy as np

#1 创建
print(pd.Series([9,8,7]))     
# 自动索引 0 9 1 8 2 7 
print(pd.Series([9,8,7], index=['a','b','c'])) 
# 自定义索引 a 9 b 8 c 7
print(pd.Series({'a':9,'b':8,"c":7})) 
# a 9 b 8 c 7

#2 属性
s = pd.Series([9,8,7,6],['a','b','c','d'])
print(s.index)  # 获取索引
print(s.values) # 获取值

#3 索引
print(s[0], s['a'])  # 9 9
print(s[:3])         # a 9 b 8 c 7
print('c' in s)      # True
print(s.get('f', 0)) # 0 索引不存在时返回0

#4 操作
s['a'] = 90
s['b','c'] = 80
s[s > s.median()] = 100
print(s) 
# a 100 b 80 c 80 d 6
print(s.drop(['b','c'])) 
# a 100 d 6 drop操作不改变s

s2 = np.exp(s)
print(s+s2)

DataFrame

# 带标签的二维数组
         
import pandas as pd
import numpy as np

#1 创建
print(pd.DataFrame(np.arange(10).reshape(2,5)))
#   0 1 2 3 4
# 0 0 1 2 3 4
# 1 5 6 7 8 9

dt = {'one': pd.Series([1,2,3],['a','b','c']),
      'two': pd.Series([9,8,7,6],['a','b','c','d'])}
print(pd.DataFrame(dt))
#   one two
# a 1.0  9
# b 2.0  8
# c 3.0  7
# d NaN  6
print(pd.DataFrame(dt,index=['b','c','d'],columns=['two','three']))
#   two three
# b  8   NaN
# c  7   NaN
# d  6   NaN

#2 属性
dt = {'one': [1,2,3,4], 'two': [9,8,7,6]}
d = pd.DataFrame(dt,index=['a','b','c','d'])
#   one two
# a  1   9
# b  2   8
# c  3   7
# d  4   6
print(d.index)   
# Index(['a', 'b', 'c', 'd'], dtype='object')
print(d.columns) 
# Index(['one', 'two'], dtype='object')
print(d.values)
print(d['one'])
print(d['one']['a']) # 1

#3 运算
dt = {'one': [1,2,3,4], 'two': [9,8,7,6]}
d = pd.DataFrame(dt,index=['a','b','c','d'])
#   one two
# a  1   9
# b  2   8
# c  3   7
# d  4   6

print(d.add(1, fill_value=100))
print(d.sub(1))
print(d.mul(2))
print(d.div(pd.Series([2,3], index=['one','two'])))
#    one    two
# a  0.5  3.000000
# b  1.0  2.666667
# c  1.5  2.333333
# d  2.0  2.000000

print(d > 5)
print(d > pd.Series([2,3], index=['one','two']))
#     one   two
# a  False  True
# b  False  True
# c   True  True
# d   True  True

#4 索引排序
d = pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
#     0   1   2   3   4
# c   0   1   2   3   4
# a   5   6   7   8   9
# d  10  11  12  13  14
# b  15  16  17  18  19

print(d.sort_index())
print(d.sort_index(axis=1, ascending=False))
#     4   3   2   1   0
# c   4   3   2   1   0
# a   9   8   7   6   5
# d  14  13  12  11  10
# b  19  18  17  16  15

#5 值排序
np.random.seed(0)
d = pd.DataFrame(np.random.randint(1,9,(4,5)),index=['c','a','d','b'])
#    0  1  2  3  4
# c  5  8  6  1  4
# a  4  4  8  2  4
# d  6  3  5  8  7
# b  1  1  5  3  2

print(d.sort_values(2, ascending=False))
print(d.sort_values('d', axis=1))
#    1  2  0  4  3
# c  8  6  5  4  1
# a  4  8  4  4  2
# d  3  5  6  7  8
# b  1  5  1  2  3

统计函数

import pandas as pd

# Series:
s = pd.Series([5,8,9,4],['a','b','c','d'])
print(s.argmin(), s.argmax()) # 3 2
print(s.idxmin(), s.idxmax()) # d c

# Series和DataFrame:
s = pd.Series([5,8,2,4],['a','b','c','d'])
print(s.sum())      # 19 
print(s.count())    # 4
print(s.mean())     # 4.75
print(s.median())   # 4.5
print(s.min())      # 2
print(s.max())      # 8
print(s.var())      # 6.25
print(s.std())      # 2.5
print(s.describe()) # 给出一些基本的统计值

s.cumsum()  # 依次给出前1、2...个数的和
s.cumprod() # 依次给出前1、2...个数的积
s.cummax()  # 依次给出前1、2...个数的最大值
s.cummin()  # 依次给出前1、2...个数的最小值

s.rolling(2).sum()  #依次计算相邻2个数的和
s.rolling(2).mean() #依次计算相邻2个数的均值
s.rolling(2).var()  #依次计算相邻2个数的方差
s.rolling(2).std()  #依次计算相邻2个数的标准差
s.rolling(2).min()  #依次计算相邻2个数的最小值
s.rolling(2).max()  #依次计算相邻2个数的最大值

d = pd.DataFrame(np.arange(20).reshape(4,5),index=['c','a','d','b'])
#     0   1   2   3   4
# c   0   1   2   3   4
# a   5   6   7   8   9
# d  10  11  12  13  14
# b  15  16  17  18  19
print(d.describe())

3.matplotlib

基本绘图

import matplotlib.pyplot as plt

plt.title('Test')    # 标题
plt.xlabel("Time")   # x轴标签
plt.ylabel("Num")    # y轴标签
plt.grid(True)       # 显示网格线

# 设置横坐标(0,10),纵坐标(0,6)
plt.axis([0,10,0,6]) 

# 绘制,x轴为(0,1,2,3)
plt.plot([1,2,3,4])  

# 绘制(x,y)
plt.plot([0,2,4,6],[1,2,3,4]) 

plt.savefig('plt', dpi=600)   # 保存为图片
plt.show()                    # 显示

绘图样式

import matplotlib.pyplot as plt

a = np.arange(0., 5., 0.2)
plt.plot(a,a,'go-', a,a*1.5,'rx', a,a**2,'b-.', linewidth=2.0) 

'''
颜色字符:b蓝色 g绿色 r红色 c青绿色 m洋红色 y黄色 k黑色 w白色

风格字符:-实线 --破折线 -.点划线 :虚线 ''无线条

标记字符:
.点标记 ,像素标记 o实心圈 
v倒三角 ^上三角 >右三角 <左三角
1下花三角 2上花三角 3左花三角 4右花三角
s实心方形 p实心五角 *星形 h竖六边形 H横六边形
+十字 x标记 D菱形 d瘦菱形 |垂直线
'''

绘图区域

import matplotlib.pyplot as plt

a = np.arange(0.0,5.0,0.02)

for i in range(1,5):
    # 设置两行两列,索引为1,2,3,4
    plt.subplot(2,2,i) 
    plt.plot(a, a**2)

plt.show()

文本箭头

import matplotlib
import matplotlib.pyplot as plt

# 全局中文显示
matplotlib.rcParams['font.family']='SimHei' 
matplotlib.rcParams['font.style']='normal'  
matplotlib.rcParams['font.size']=18 
plt.ylabel('数量')

# 局部中文显示
plt.xlabel('时间',fontproperties='Simhei',fontsize=20,color='red') 

# 文本和箭头注解
a = np.arange(0.0,5.0,0.02)
plt.plot(a, a**2)

plt.text(1,2,'mu=10',fontsize=15)

plt.annotate('mu=10',xy=(2,1),xytext=(3,1.5), arrowprops=dict(facecolor='black',shrink=0.1,width=1))

绘制图表

import matplotlib.pyplot as plt
import numpy as np

#1 饼图
labels = 'Apple','Banana','Cherry','Date'
sizes  = [15,30,45,10]
explode = (0,0,0.1,0) # 表示突出谁
plt.pie(sizes,explode=explode,labels=labels,autopct='%1.1f%%',
shadow=False,startangle=90)
plt.axis('equal')     # 绘制圆形的饼
plt.show()

#2 散点图绘制
fig, ax = plt.subplots()
ax.plot(10*np.random.randn(100),10*np.random.randn(100),'o')
ax.set_title('Scatter')
plt.show()

#3 直方图绘制
np.random.seed(0)
mu, sigma = 100, 20 
a = np.random.normal(mu, sigma, size=100)
plt.hist(a,10,histtype='stepfilled',facecolor='b',alpha=0.75) 
# 10是直方的个数

#4 极坐标绘制
N = 20
theta = np.linspace(0.0,2*np.pi,N,endpoint=False)
radii = 10*np.random.rand(N)
width = np.pi/4*np.random.rand(N)
ax = plt.subplot(111,projection='polar')
bars = ax.bar(theta,radii,width=width,bottom=0.0) 
for r,bar in zip(radii,bars):
    bar.set_facecolor(plt.cm.viridis(r/10.))
    bar.set_alpha(0.5)
plt.show()