1.numpy
创建
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()