Python库学习-Numpy

谁说我不能喝 提交于 2019-12-17 01:38:39


Python的数值运算模块Numpy,通过numpy模块的学习,你将掌握如下几方面的内容:

  • 数组的创建与操作;
  • 数组的基本数学运算;
  • 常用数学和统计函数;
  • 线性代数的求解;
  • 伪随机数的创建。

1、数组的创建与操作

Numpy的数据类型为ndarray,通过array函数创建数组:

1.1 数组创建

import numpy as np
# 一维数组
arr1 = np.array([1,2,3,4,5,6])
# 二维数组
arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]])

'''
array([1, 2, 3, 4, 5, 6])
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
'''

1.2 数组元素获取

arr2[1,1]
arr2[1:,1:]
arr2[[0,2],[0,2]]
'''
5
array([[5, 6],
       [8, 9]])
array([1, 9])
'''

1.3 数组的常用属性

1、genfromtxt函数读取外部文本文件的数据

np.genfromtxt(fname, dtype=<class ‘float’>, comments=’#’, delimiter=N skip_footer=0, converters=None, missing_values=None, filling_values=None, names=None,)
  1. dtype: 指定读入数据的数据类型,默认为浮点型,如果原数据集中含有字符型数据,必须指定数据类型为“str”;
  2. comments:指定注释符,默认为“#”,如果原数据的行首有“#”,将忽略这些行的读入;
  3. delimiter:指定数据集的列分割符;
  4. skip_header:是否跳过数据集的首行,默认不跳过。
data = np.genfromtxt('data.txt', delimiter=',', dtype=np.int)
dtype(data) # 查看数据结构
data.ndim  # 数据维数
data.shape  # 数据形状(行列数)
data.dtype  # 数据类型
data.size  # 数组元素个数
'''
array([[1, 2, 3, 4],
       [3, 5, 7, 5],
       [8, 9, 5, 3]])
'''

  数组形状处理的手段主要有reshape、resize、ravel、flatten、vstack、 hstack、row_stack和colum_stack

   reshape和resize都是用来改变数组形状的“方法”,但是reshape方法只是返回改变形状后的预览,但并未真正改变数组a的形状;而resize方法则不会返回预览,而是会直接改变数组a的形状;

a = np.arange(9)
a.reshape((3,3))
a
'''
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
'''
a.resize((3,3))  # 没有返回值
a
'''
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
'''

   如果需要将多维数组降为一维数组, 利用ravel、 flatten和reshape三种方法均可以轻松解决:

arr4 = np.array([[1,10,100],[2,20,200],[3,30,300]])
# 默认排序降维
arr4.flatten(order='C')
arr4.reshape(-1)
arr4.ravel(order='C')
# 改变排序模式的将维
arr4.flatten(order='F')
arr4.reshape(-1, order='F')
arr4.ravel(order='F')

'''
array([  1,  10, 100,   2,  20, 200,   3,  30, 300])
array([  1,  10, 100,   2,  20, 200,   3,  30, 300])
array([  1,  10, 100,   2,  20, 200,   3,  30, 300])
array([  1,   2,   3,  10,  20,  30, 100, 200, 300])
array([  1,   2,   3,  10,  20,  30, 100, 200, 300])
array([  1,   2,   3,  10,  20,  30, 100, 200, 300])
'''

  通过flatten方法实现的降维返回的是复制,因为对降维后的元素做修改, 并没有影响到原数组arr4的结果;相反,ravel方法与reshape方法返回的则是视图,通过对视图的改变,是会影响到原数组arr4的。

  vstack用于垂直方向(纵向)的数组堆叠,其功能与row_stack函数一致,而hstack则用于水平方向(横向)的数组合并,其功能与colum_stack函数一致。

2、数组的基本运算符

  四则运算中的符号分别是“+-*/”, 对应的numpy模块函数分别是np.add、np.subtract、np.multiply和np.divide。需要注意的是,函数只能接受两个对象的运算,如果需要多个对象的运算,就得使用嵌套方法。

  使用(% 、//、**)计算数组元素之间商的余数、整除部分以及数组元素之间的指数。当然,如果读者比较喜欢使用函数实现这三种运算的话,可以使用np.fmod、np.modf和np.power,但是整除的函数应用会稍微复杂一点, 需要写成np.modf(arr7/arr8)[1],因为modf可以返回数值的小数部分和整数部分,而整数部分就是要取的整除值。

arr5 = np.array([[2,2,2],[5,5,5],[3,3,3]])
arr4 // arr5
np.modf(arr4/arr5)
'''
array([[  0,   5,  50],
       [  0,   4,  40],
       [  1,  10, 100]], dtype=int32)
(array([[0.5, 0. , 0. ],
        [0.4, 0. , 0. ],
        [0. , 0. , 0. ]]), array([[  0.,   5.,  50.],
        [  0.,   4.,  40.],
        [  1.,  10., 100.]]))
'''

2.1 广播运算

  各种数学运算符都是基于相同形状的数组,当数组形状不同时, 也能够进行数学运算的功能称为数组的广播。但是数组的广播功能是有规则的, 如果不满足这些规则,运算时就会出错。数组的广播规则是:

  1. 各输入数组的维度可以不相等,但必须确保从右到左的对应维度值相等;
  2. 如果对应维度值不相等,就必须保证其中一个为1;
  3. 各输入数组都向其shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐。
# 数组的维度可以不相等,但对应维度值相等
arr6 = np.arange(24).reshape(2,4,3)
arr7 = np.arange(12).reshape(4,3)
arr6 + arr7
# 对应维度值不相等,就必须保证其中一个为1
arr8 = np.arange(4).reshape(4,1)
arr8 + arr6
'''
array([[[ 0,  2,  4],
        [ 6,  8, 10],
        [12, 14, 16],
        [18, 20, 22]],

       [[12, 14, 16],
        [18, 20, 22],
        [24, 26, 28],
        [30, 32, 34]]])

array([[[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10],
        [12, 13, 14]],

       [[12, 13, 14],
        [16, 17, 18],
        [20, 21, 22],
        [24, 25, 26]]])
'''

3、常用的数学和统计函数

  在这里插入图片描述
  根据上面的表格,需要对统计函数重点介绍,这些统计函数都有axis参数,该参数的目的就是在统计数组元素时需要按照不同的轴方向计算,如果axis=1,则表示按水平方向计算统计值, 即计算每一行的统计值;如果axis=0,则表示按垂直方向计算统计值, 即计算每一列的统计值。

4、线性代数的相关计算

   数据挖掘的理论背后几乎离不开有关线性代数的计算问题,如矩阵乘法、 矩阵分解、行列式求解等。numpy模块同样可以解决各种线性代数相关的计算,只不过需要调用Numpy的子模块linalg(线性代数的缩写),该模块几乎提供了线性代数所需的所有功能。
  在这里插入图片描述

# 点积函数dot
np.dot(arr4,arr5)
'''
array([[ 352,  352,  352],
       [ 704,  704,  704],
       [1056, 1056, 1056]])
'''
np.diag(arr7)
np.diag(np.array([5,15,25]))
'''
# 取出矩阵主对角线上元素
array([0, 4, 8])
# 由一维数组构建方阵
array([[ 5,  0,  0],
       [ 0, 15,  0],
       [ 0,  0, 25]])
'''

4.1 特征根与特征向量

  假设A为n阶方阵,如果存在数λ和非零向量,使得Ax=λx(x≠0),则称λ为A的特征根,x为特征根λ对应的特征向量。

arr9 = np.arange(16).reshape(4,-1)
np.linalg.eig(arr9)
'''
# 特征值和特征向量
(array([ 3.24642492e+01, -2.46424920e+00,  2.14966418e-15, -1.17200157e-16]),
 array([[-0.11417645,  0.7327781 , -0.40377562,  0.05533605],
        [-0.3300046 ,  0.28974835,  0.81421492,  0.33237807],
        [-0.54583275, -0.15328139, -0.41710299, -0.83076428],
        [-0.76166089, -0.59631113,  0.00666369,  0.44305017]]))
'''

4.2 多元线性回归模型的解

  多元线性回归模型一般用来预测连续的因变量,该模型可以写成Y=Xβ+ε, 其中Y为因变量,X为自变量,ε为误差项。要想根据已知的X来预测Y的话,必须得知道偏回归系数β的值。 偏回归系数的求解方程,即β=(X’X)-1X’Y)

X = np.array([[1,1,4,3],[1,2,7,6],[1,2,6,6],[1,3,8,7],[1,2,5,8],[1,3,7,5],[1,6,10,12],[1,5,7,7],[1,6,3,4],[1,5,7,8]])
Y = np.array([3.2,3.8,3.7,4.3,4.4,5.2,6.7,4.8,4.2,5.1])
x_trans_x_inv = np.linalg.inv(np.dot(np.transpose(X),X))
beta = np.dot(np.dot(x_trans_x_inv, np.transpose(X)), Y)
beta
'''
# 偏回归系数
array([1.78052227, 0.24720413, 0.15841148, 0.13339845])
	Y=1.781+0.247x1+0.158x2+0.133x3
'''

4.3 多元一次方程组的求解

在这里插入图片描述
  在线性代数中,这个方程组就可以表示成AX=b, A代表等号左边数字构成的矩阵,X代表三个未知数,b代表等号右边数字构成的向量。如需求解未知数X,可以直接使用linalg子模块中的solve函数

A = np.array([[3,2,1],[2,3,1],[1,2,3]])
b = np.array([39,34,26])
X = np.linalg.solve(A,b)
X
'''
array([9.25, 4.25, 2.75])
'''
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!