目录
3-2 魔法命令
3-3 Numpy数据基础numpy.array基础
3-4 创建numpy数组和矩阵
3-5 numpy数组的基本操作
3-6 numpy数组的合并与分割
3-7 numpy中的矩阵运算
3-2 魔法命令
%run
In [10]: %run time.py
-----------执行开始----------
100%[**************************************************->]5.46s
-----------执行结束----------
%timeit
#测量性能的命令
In [21]: %timeit L = [i**2 for i in range(1000)]
343 µs ± 9.82 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
%time
In [24]: %time L = [i**2 for i in range(1000)]
Wall time: 995 µs
%lsmagic
可以查看所有的魔法命令
3-3 Numpy数据基础numpy.array基础
python list的特点
In [34]: L = [i for i in range(10)]
In [35]: L
Out[35]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [36]: L[5]
Out[36]: 5
In [38]: L[5]=100
In [39]: L
Out[39]: [0, 1, 2, 3, 4, 100, 6, 7, 8, 9]
In [40]: L[5] = "Machine learning"
In [41]: L
Out[41]: [0, 1, 2, 3, 4, 'Machine learning', 6, 7, 8, 9]
限定只能存储一种数据类型的数组
#第一个参数表示定义的数据类型,i表示整形
In [44]: arr = array.array('i',[i for i in range(10)])
In [45]: arr
Out[45]: array('i', [0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
#不能赋值其他数据类型
numpy中的array
In [52]: nparr = numpy.array([i for i in range(10)])
In [53]: nparr
Out[53]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [54]: nparr[5]
Out[54]: 5
In [55]: nparr[5] = 100
In [56]: nparr
Out[56]: array([ 0, 1, 2, 3, 4, 100, 6, 7, 8, 9])
#不可以赋值其他类型的数据
In [58]: nparr[5] = "machine"
Traceback (most recent call last):
File "<ipython-input-58-538ed72de039>", line 1, in <module>
nparr[5] = "machine"
ValueError: invalid literal for int() with base 10: 'machine'
#查看数组的数据类型
In [59]: nparr.dtype
Out[59]: dtype('int32')
#强制类型转换
In [61]: nparr[3] = 3.14
In [62]: nparr
Out[62]: array([ 0, 1, 2, 3, 4, 100, 6, 7, 8, 9])
In [64]: nparr2 = numpy.array([1,2,3.0])
In [66]: nparr2.dtype
Out[66]: dtype('float64')
3-4 创建numpy数组和矩阵
#创建全0数组或矩阵
In [68]: numpy.zeros(10)
Out[68]: array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [69]: numpy.zeros(10).dtype
Out[69]: dtype('float64')
#控制生成的元素的数据类型
In [70]: numpy.zeros(10,dtype=int)
Out[70]: array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
#矩阵
In [72]: numpy.zeros((3,5))
Out[72]:
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
#参数:大小,类型
In [73]: numpy.zeros(shape=(3,5),dtype=int)
Out[73]:
array([[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])
#创建全1的数组或矩阵
#数组
In [77]: numpy.ones(10)
Out[77]: array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
#矩阵
In [78]: numpy.ones((3,5))
Out[78]:
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
#指定创建的数组或矩阵中填充的数字
#写出参数名时参数顺序可以改变
In [81]: numpy.full(shape=(3,5),fill_value=666)
Out[81]:
array([[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666]])
In [82]: numpy.full(shape=(3,5),fill_value=666.0)
Out[82]:
array([[666., 666., 666., 666., 666.],
[666., 666., 666., 666., 666.],
[666., 666., 666., 666., 666.]])
arange
In [85]: [i for i in range(0,20,2)]
Out[85]: [0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
In [86]: numpy.arange(0,20,2)
Out[86]: array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
#numpy中的arange可以传入浮点数
In [88]: numpy.arange(0,1,0.2)
Out[88]:
array([ 0. , 0.2, 0.4, 0.6, 0.8])
#默认起始点0、间隔1
In [90]: numpy.arange(0,10)
Out[90]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [91]: numpy.arange(10)
Out[91]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
linspace
#在区间等长的截取10个点,包括0和20这两个点
#最后一个参数不是步长,而是要截取的点的个数
In [94]: numpy.linspace(0,20,10)
Out[94]:
array([ 0. , 2.22222222, 4.44444444, 6.66666667, 8.88888889,
11.11111111, 13.33333333, 15.55555556, 17.77777778, 20. ])
random
#生成一个0~10之间的随机数
#区间前闭后开
In [100]: numpy.random.randint(0,10)
Out[100]: 5
#生成一个随机数组
In [101]: numpy.random.randint(0,10,10)
Out[101]: array([9, 3, 3, 2, 6, 4, 6, 1, 2, 6])
#生成一个随机矩阵
In [107]: numpy.random.randint(4,8,size=(3,5))
Out[107]:
array([[4, 7, 5, 6, 5],
[5, 7, 5, 7, 6],
[6, 6, 5, 4, 5]])
#随机种子会让生成的随机数相同
In [110]: numpy.random.randint(4,8,size=(3,5))
Out[110]:
array([[4, 6, 5, 6, 6],
[6, 5, 6, 4, 5],
[7, 6, 7, 4, 7]])
In [111]: numpy.random.seed(666)
In [112]: numpy.random.randint(4,8,size=(3,5))
Out[112]:
array([[4, 6, 5, 6, 6],
[6, 5, 6, 4, 5],
[7, 6, 7, 4, 7]])
#生成0和1之间的随机数
#生成的是在0、1之间均匀分布的浮点数
In [114]: numpy.random.random()
Out[114]: 0.2811684913927954
In [116]: numpy.random.random(10)
Out[116]:
array([0.46284169, 0.23340091, 0.76706421, 0.81995656, 0.39747625,
0.31644109, 0.15551206, 0.73460987, 0.73159555, 0.8578588 ])
In [117]: numpy.random.random((3,5))
Out[117]:
array([[0.76741234, 0.95323137, 0.29097383, 0.84778197, 0.3497619 ],
[0.92389692, 0.29489453, 0.52438061, 0.94253896, 0.07473949],
[0.27646251, 0.4675855 , 0.31581532, 0.39016259, 0.26832981]])
#生成正态分布的浮点数
#默认是生成均值为0方差为1;
In [120]: numpy.random.normal()
Out[120]: 0.7760516793129695
#生成均值为10方差为100
In [121]: numpy.random.normal(10,100)
Out[121]: 128.06359754812632
In [124]: numpy.random.normal(0,1,(3,5))
Out[124]:
array([[ 0.06102404, 1.07856138, -0.79783572, 1.1701326 , 0.1121217 ],
[ 0.03185388, -0.19206285, 0.78611284, -1.69046314, -0.98873907],
[ 0.31398563, 0.39638567, 0.57656584, -0.07019407, 0.91250436]])
3-5 numpy数组的基本操作
基本属性
#x.ndim查看数组维数
In [128]: x = numpy.arange(15).reshape(3,5)
In [129]: x
Out[129]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
In [130]: x.ndim
Out[130]: 2
#x.shape每个维度的元素个数
In [131]: x.shape
Out[131]: (3, 5)
#x.size 元素个数
In [132]: x.size
Out[132]: 15
#x.reshape不会改变x
#x.reshape(10,-1)只要10行,不管列数
#x.reshape(-1,2)不管行数,每行两个元素
In [156]: x
Out[156]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [157]: x.reshape(2,5)
Out[157]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [158]: x
Out[158]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
numpy.array的元素访问
#一维
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
In [134]: x[5]
In [133]: x[:-1]
In [134]: x[0:5] #访问到5但不包含5
#切片
In [140]: X[::2]
Out[140]: array([0, 2, 4, 6, 8])
In [141]: X[::-1]
Out[141]: array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
#二维
In [133]: x[2,2]
#切片
In [142]: x[:2,:3] #前两行前三列
Out[142]:
array([[0, 1, 2],
[5, 6, 7]])
In [143]: x[:2,::2] #前两行,从头到尾间隔为2
Out[143]:
array([[0, 2, 4],
[5, 7, 9]])
In [147]: x[0,:].ndim #取出了第一行
Out[147]: 1
#对矩阵取子矩阵,修改子矩阵中的元素,也会改变矩阵的元素
#subx = x[:2,:3] #引用
In [153]: subx = x[:2,:3].copy() #获得副本
3-6 numpy数组的合并与分割
numpy.concatenate([x,y]) #其中可以有多个元素
In [170]: A = numpy.array([[1,2,3],[4,5,6]])
#axis默认是0,沿着行的方向进行拼接
In [173]: numpy.concatenate([A,A],axis=)
Out[173]:
array([[1, 2, 3],
[4, 5, 6],
[1, 2, 3],
[4, 5, 6]])
#沿着列的方向进行拼接
In [174]: numpy.concatenate([A,A],axis=1)
Out[174]:
array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])
numpy.vstack([A,z]) #拼接两个不同维度的元素,垂直方向拼接
In [177]: numpy.vstack([A,z])
Out[177]:
array([[1, 2, 3],
[4, 5, 6],
[6, 6, 6]])
#拼接两次
In [29]: v
Out[29]: array([1, 2])
In [30]: numpy.vstack([v]*2)
Out[30]:
array([[1, 2],
[1, 2]])
numpy.hstack([A,B]) #水平方向拼接
In [178]: B = numpy.full((2,2),100)
In [179]: B
Out[179]:
array([[100, 100],
[100, 100]])
In [180]: numpy.hstack([A,B])
Out[180]:
array([[ 1, 2, 3, 100, 100],
[ 4, 5, 6, 100, 100]])
numpy.split() #数据的分割
#向量
In [181]: x = numpy.arange(10)
In [182]: x
Out[182]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
In [183]: numpy.split(x,[3,7])
Out[183]: [array([0, 1, 2]), array([3, 4, 5, 6]), array([7, 8, 9])]
#矩阵
In [186]: A = numpy.arange(16).reshape((4,4))
In [187]: A
Out[187]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [188]: A1,A2 = numpy.split(A,[2])
In [189]: A1
Out[189]:
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
In [190]: A2
Out[190]:
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
#基于列进行分割(默认是0,基于行)
In [191]: numpy.split(A,[2],axis=1)
Out[191]:
[array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]]), array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])]
numpy.vsplit() #基于行进行分割,相当于axis = 0
numpy.hsplit() #基于列进行分割,相当于axis = 1
In [195]: X,y = numpy.hsplit(A,[-1])
#分割最后一列
In [197]: X
Out[197]:
array([[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10],
[12, 13, 14]])
In [198]: y
Out[198]:
array([[ 3],
[ 7],
[11],
[15]])
3-7 numpy中的矩阵运算
numpy中两个矩阵之间的运算都是对应元素在做运算
A*B是A、B两个矩阵的对应元素相乘
标准的矩阵的乘法为:A.dot(B)
A.T 矩阵的转置
In [29]: v
Out[29]: array([1, 2])
#拼接到和A的维度一样后相加
In [31]: numpy.vstack([v]*A.shape[0])+A
Out[31]:
array([[1, 3],
[3, 5]])
#或指定v在每个方向上堆叠的次数
In [33]: numpy.tile(v,[2,1])+A
Out[33]:
array([[1, 3],
[3, 5]])
矩阵的逆
In [35]: A
Out[35]:
array([[0, 1],
[2, 3]])
#求逆
In [37]: invA=numpy.linalg.inv(A)
In [38]: A.dot(invA)
Out[38]:
array([[1., 0.],
[0., 1.]])
当矩阵不是方阵时,可以求伪逆矩阵
In [39]: X = numpy.arange(16).reshape((2,8))
In [40]: X
Out[40]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7],
[ 8, 9, 10, 11, 12, 13, 14, 15]])
In [41]: invpX = numpy.linalg.pinv(X)
In [43]: invpX
Out[43]:
array([[-1.35416667e-01, 5.20833333e-02],
[-1.01190476e-01, 4.16666667e-02],
[-6.69642857e-02, 3.12500000e-02],
[-3.27380952e-02, 2.08333333e-02],
[ 1.48809524e-03, 1.04166667e-02],
[ 3.57142857e-02, -1.04083409e-17],
[ 6.99404762e-02, -1.04166667e-02],
[ 1.04166667e-01, -2.08333333e-02]])
#求得的单位矩阵是个方阵
In [46]: X.dot(invpX)
Out[46]:
array([[ 1.00000000e+00, -2.49800181e-16],
[ 0.00000000e+00, 1.00000000e+00]])
3-8 numpy中的聚合运算
L是个向量
#numpy中的方法比直接使用如sum()的方法效率高
numpy.sum(L) #求和
numpy.min(L) #最小值
numpy.max(L) #最大值
x是个矩阵
numpy.sum(x,axis = 0) #沿着行方向进行求和运算,即对每一列求和
numpy.sum(x,axis=1) #沿着列方向进行运算
numpy.prod(x) #所有元素的乘积
numpy.prod(x+1) #每个元素加一后的乘积
numpy.mean(x) #平均值
numpy.median(x) # 中位数
#百分位
numpy.percentile(L,q=50) = numpy.median(L)
numpy.percentile(L,q=100) = numpy.max(L)
for percent in [0,25,50,75,100]:
numpy.percentile(L, q = percent)
#方差
numpy.var(L)
#标准差
numpy.std(L)
3-9 numpy中的arg运算 索引
#最小、最大值的索引值
numpy.argmin(L)
numpy.argmax(L)
#排序和使用索引
numpy.random.shuffle(x) #打乱顺序
numpy.sort(x) #排序,没有改变x本身
x.sort() #x本身改变了
numpy.sort(x,axis=0) #沿着行的方向排序,每一列都是有序的
numpy.sort(x,axis=1) #沿着列的方向进行排序,每一行都是有序的
numpy.argsort(x) #返回元素的索引
In [86]: x
Out[86]: array([11, 8, 10, 0, 7, 15, 13, 4, 9, 6, 3, 14, 1, 12, 2, 5])
#元素从小到大的索引
In [87]: numpy.argsort(x)
Out[87]:
array([ 3, 12, 14, 10, 7, 15, 9, 4, 1, 8, 2, 0, 13, 6, 11, 5],
dtype=int64)
numpy.partitions(x,3) #返回的标定点前面比标定点小,后面比标定点大
In [88]: numpy.partition(x,3)
Out[88]: array([ 0, 1, 2, 3, 4, 5, 13, 8, 9, 6, 15, 14, 7, 12, 10, 11])
numpy.argpartitions(x,3) #返回的是索引
3-10 numpy中的比较和FancyIndexing
Fancy Indexing
In [91]: x
Out[91]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]
#fancy indexing
In [95]: ind = [3,5,8]
In [96]: x[ind]
Out[96]: array([3, 5, 8])
In [97]: ind = numpy.array([[0,2],[1,3]])
In [98]: x[ind]
Out[98]:
array([[0, 2],
[1, 3]])
In [99]: X = x.reshape(4,-1)
In [100]: X
...:
Out[100]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [104]: row = numpy.array([0,1,2])
...: col = numpy.array([1,2,3])
...: X[row,col]
Out[104]: array([ 1, 6, 11])
In [105]: X[0,col]
Out[105]: array([1, 2, 3])
In [106]: X[:2,col]
Out[106]:
array([[1, 2, 3],
[5, 6, 7]])
#可以用bool值来表示
In [107]: col = [True,False,True,True]
In [108]: X[1:3,col]
Out[108]:
array([[ 4, 6, 7],
[ 8, 10, 11]])
numpy.array的比较
In [109]: x
Out[109]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15])
#比较
In [110]: x < 3
Out[110]:
array([ True, True, True, False, False, False, False, False, False,
False, False, False, False, False, False, False])
#返回符合条件的值的个数
In [111]: numpy.sum(x<=3)
Out[111]: 4
#返回符合条件的值中非零值的个数
In [112]: numpy.count_nonzero(x<=3)
Out[112]: 4
#是否存在为0的数
In [113]: numpy.any(x==0)
Out[113]: True
#是否所有值都>=0
In [116]: numpy.all(x>=0)
Out[116]: True
In [118]: X
Out[118]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
In [119]: numpy.sum(X%2==0)
Out[119]: 8
#从列的方向,即计算每行的偶数的个数
In [120]: numpy.sum(X%2==0,axis=1)
Out[120]: array([2, 2, 2, 2])
#每行中,是否所有元素都>0
In [121]: numpy.all(X>0,axis=1)
Out[121]: array([False, True, True, True])
#与、或、非
In [123]: numpy.sum((x>3)&(x<10))
Out[123]: 6
In [124]: numpy.sum((x%2==0)|(x>10))
Out[124]: 11
In [125]: numpy.sum(~(x==0))
Out[125]: 15
#输出符合条件的具体的值
In [126]: x[x<5]
Out[126]: array([0, 1, 2, 3, 4])
In [127]: x[x%2==0]
Out[127]: array([ 0, 2, 4, 6, 8, 10, 12, 14])
In [128]: X[X[:,3]%3==0]
Out[128]:
array([[ 0, 1, 2, 3],
[12, 13, 14, 15]])
3-11matplotlib数据可视化基础
折线图
In [129]: import matplotlib as mpl
In [130]: import matplotlib.pyplot as plt
#绘图
In [141]: plt.plot(x,siny)
...: plt.plot(x,cosy,color="red",linestyle="--")
Out[141]:
linestyle:"--"、":"、 "-"、 "-."
#调节x,y两个轴的范围
plt.xlim(-5,15)
plt.ylim(0,1.5)
plt.axis(-1,11,-2,2) #同时调节x,y轴
plt.xlable("x axis")
plt.ylable("y value")
#增加图示
plt.plot(x,cosy,color="red",linestyle="--",label="cos(x)")
plt.plot(x,siny,label="sin(x)")
plt.legend()
#增加标题
plt.title("Welcome to the ML World")
散点图scatter
plt.scatter(x,siny,alpha = 0.5) #alpha设置点的透明度