文章目录
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,)
- dtype: 指定读入数据的数据类型,默认为浮点型,如果原数据集中含有字符型数据,必须指定数据类型为“str”;
- comments:指定注释符,默认为“#”,如果原数据的行首有“#”,将忽略这些行的读入;
- delimiter:指定数据集的列分割符;
- 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;
- 各输入数组都向其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])
'''
来源:CSDN
作者:qq_32477301
链接:https://blog.csdn.net/qq_32477301/article/details/103561891