Python数据处理笔记02--numpy矩阵操作

Python数据处理笔记01--numpy数组操作 

声明:本文环境为Windows10+jupyter notebook,请自行下载安装Anaconda 

1、矩阵生成

【numpy矩阵库】

> Numpy中包含了一个矩阵库numpy.matlib,该模块中的函数返回的是一个矩阵,而不是一个mdarray对象。

> 一个m×n的矩阵是一个由m行(row)n列(column)元素排列成的矩阵阵列。

> 矩阵里的元素可以是数字、符号或数学式。

> Numpy和Maylib不一样,对于多维数组的运算,缺省情况下并不能使用矩阵运算,如果希望使用对数组进行矩阵运算的话,可以调用相应的函数。

# 常规方法生成
>> import numpy as np

>> x = np.matrix([[1,2,3],[4,5,6]])
>> y = np.matrix([1,2,3,4,5,6])
# x[0,0]返回行下标和列下标都为0的元素
# 注意,对于矩阵x来说,x[0,0]和x[0][0]的含义不一样
>> print(x,y,x[0,0],x[0][0],sep='\n\n')

 运行结果:

[[1 2 3]
 [4 5 6]]

[[1 2 3 4 5 6]]

1

[[1 2 3]]

》》matlib.empty()

numpy.matlib.empty(shape,dtype,order)

> shape:定义新矩阵形状的整数或整数元组

> Dtype:可选,数据类型

扫描二维码关注公众号,回复: 8872190 查看本文章

> order:C(行序优先)或F(列序优先)

import numpy.matlib
import numpy as np

print(np.matlib.empty((2,2)))   # 填充为随机数据

运行结果:

[[5.e-324 5.e-324]
 [0.e+000 0.e+000]]

> numpy.matlib.zeros():创建一个以0填充的矩阵

> numpy.matlib.ones():创建一个以1填充的矩阵

import numpy.matlib
import numpy as np

print(np.matlib.zeros((2,2)))   # 创建一个2行2列的全0矩阵
print(np.matlib.ones((2,2)))    # 创建一个2行2列的全1矩阵

运行结果:

[[0. 0.]
 [0. 0.]]
[[1. 1.]
 [1. 1.]]

> numpy.matlib.eye():函数返回一个矩阵,对角线元素为1,其他位置为零。

numpy.matlib.eye(n,M,k,dtype)

# n:返回矩阵的行数
# M:返回矩阵的列数,默认为n
# k:对角线的索引
# dtype:数据类型
>> import numpy.matlib
>> import numpy as np

>> print(np.matlib.eye(n=3,M=4,k=0,dtype=int))

# 输出结果
[[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]]

numpy.matlib.identity():返回给定大小的单位矩阵

> 单位矩阵是个方阵,从左上角到右下角的对角线(称为主对角线)上的元素均为1,除此以外全都为0.

>> import numpy.matlib
>> import numpy as np

# 大小为4,类型为整型
>> print(np.matlib.identity(4,dtype=int))

# 输出结果:
[[1 0 0 0]
 [0 1 0 0]
 [0 0 1 0]
 [0 0 0 1]]

numpy.matlib.rand()函数:创建一个给定大小的矩阵,数据是随机填充的

>> import numpy.matlib
>> import numpy as np

>> print(np.matlib.rand(4,4))   # 创建一个4×4的随机矩阵,元素数值0~1

# 输出结果:
[[0.042389   0.89404592 0.55245114 0.6151029 ]
 [0.83161717 0.88771178 0.91317702 0.23470988]
 [0.75805183 0.1603858  0.50485415 0.39672934]
 [0.76878398 0.22699211 0.25993602 0.3127131 ]]

2、常用矩阵操作

【矩阵与维数组相互转换】

> 矩阵总是二维的,而ndarray是一个n维数组。两个对象都是可互换的

>> import numpy.matlib
>> import numpy as np

>> i = np.matrix('1,2;3,4')   # 创建一个二维矩阵i
>> print(i)
>> j = np.asarray(i)     # 用i创建一个二维数组j
>> print(j)
>> k = np.asmatrix(j)    # 用j创建一个二维矩阵k
>> print(k)

# 输出结果:
[[1 2]
 [3 4]]
[[1 2]
 [3 4]]
[[1 2]
 [3 4]]

【查看矩阵特征】

# 查看矩阵特征

import numpy as np

x = np.matrix([[1,2,3],[4,5,6],[7,8,9]])
print(x,'\n')

print(x.mean(),end='\n===\n')               # 所有元素的平均值
print(x.mean(axis=0),end='\n===\n')         # 按列求平均值
print(x.mean(axis=0).shape,end='\n===\n')   # 按列得出的平均值的组合的形状
print(x.mean(axis=1),end='\n===\n')         # 横向平均值

print(x.sum(),end='\n===\n')                # 所有元素之和
print(x.max(axis=1),end='\n===\n')          # 按行求最大值
print(x.argmax(axis=0),end='\n===\n')        # 横向最大值的下标

print(x.diagonal(),end='\n===\n')           # 对角线元素

输出结果:

[[1 2 3]
 [4 5 6]
 [7 8 9]] 

5.0
===
[[4. 5. 6.]]
===
(1, 3)
===
[[2.]
 [5.]
 [8.]]
===
45
===
[[3]
 [6]
 [9]]
===
[[2 2 2]]
===
[[1 5 9]]
===

【矩阵乘法】

A=\left ( a_{_{i}^{j}} \right )_{i,j=1}^{m,p}B=\left ( b_{ij} \right )_{i,j=1}^{p,n}C=\left ( c_{ij} \right )_{i,j=1}^{m,n}c_{ij}=\sum_{k=1}^{p}a_{ik}b_{kj}

即m行p列的矩阵与p行n列的矩阵相乘得到一个m行n列的矩阵,取前者行,后者列

# 矩阵乘法

import numpy as np

x = np.matrix([[1,2,3],[4,5,6]])
y = np.matrix([[1,2],[3,4],[5,6]])
print(x*y)

运算结果:

[[22 28]
 [49 64]]

3、矩阵运算

> numpy.linalg中有一组标准的矩阵分解运算以及诸如求逆和行列式之类的东西

> 他们跟MATLIB和R等语言所使用的的是相同的行业标准级Fortran库。

函数 说明
diag 以一维数组的形式返回方阵的对角线(或非对角线)元素,或将一维数组转换为方阵(非对角线元素为0)
dot 矩阵乘法
trace 计算对角线元素的和
det

计算矩阵行列式

eig 计算方阵的特征值和特征向量
inv 计算方阵的逆
svd 计算奇异值分解(SVD)
solve 解线性方程组Ax=b,其中A为一个方阵
lstsq 计算Ax=b的最小二乘解

numpy.dot():两个数组的点积,即元素对应相乘。

> 对于两个一维数组,计算的是这两个数组对应下标元素乘积和(数学上称为内积)。

> 对于二维数组,计算的是两个数组的矩阵乘积

> 对于多维数组,它的通用公式如下,即结果数组中的每个元素都是:数组a的最后以为上的所有元素与数组b的倒数第二位上的所有元素的和

dot(a,b)[i,j,k,m] = sum(a,[i,j,:]*b[k:,m])
numpy.dot(a,b,out=None)

# a:ndarray数组
# b:ndarray数组
# out:ndarray可选,用来保存dot()的计算结果
# numpy.dot()示例

import numpy.matlib
import numpy as np

a=np.array([[1,2],[3,4]])
b=np.array([[11,12],[13,14]])
print(np.dot(a,b))

 输出结果:

[[37 40]
 [85 92]]

numpy.vdot():返回两个向量的点积

> 如果第一个参数是复数,那么它的共轭复数会被用于计算,如果参数是多维数组,会被展开

import numpy as np

a = np.array([[1,2],[3,4]])
b = np.array([[11,12],[13,14]])
print(a,'\n',b)
# vdot将数组展开计算内积,即对应位置元素相乘之和
print(np.vdot(a,b))

运行结果:

[[1 2]
 [3 4]] 
 [[11 12]
 [13 14]]
130

【numpy.linalg.inv():计算逆矩阵】

> 逆矩阵(inverse matrix):设A是数域上的一个n阶矩阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E,则我们称B是A的逆矩阵,而A则被称为可逆矩阵。注:E为单位矩阵

import numpy as np

x = np.array([[1,2],[3,4]])
y = np.linalg.inv(x)    # 计算x的逆矩阵
print(x)     
print(y)

print(np.dot(x,y))  # 验证x与y的内积是否为1

输出结果: 

[[1 2]
 [3 4]]
[[-2.   1. ]
 [ 1.5 -0.5]]
[[1.00000000e+00 1.11022302e-16]
 [0.00000000e+00 1.00000000e+00]]

numpy.linalg.solve():求矩阵形式的线性方程的解

线性方程组:

    a_{11}x_{1}+a_{12}x_{2}+...+a_{1n}x_{n}=b_{1}

    a_{21}x_{1}+a_{22}x_{2}+...+a_{2n}x_{n}=b_{2}

                                ...

    a_{n1}x_{1}+a_{n2}x_{2}+...+a_{nn}x_{n}=b_{n}

可写作矩阵相乘的形式

    ax=b

其中,a为n×n的矩阵,x和b为m×1的矩阵

例如:下面这个线性方程组

x + y + z = 6

2y + 5z = -4

2x + 5y - z =27

# numpy.linalg.solve():求矩阵形式的线性方程的解

import numpy as np

a = np.array([[1,1,1],[0,2,5],[2,5,-1]])   # 系数矩阵
b = np.array([6,-4,27])                    # 系数矩阵
x = np.linalg.solve(a,b)        # 求解
print(x)
print(np.dot(a,x))              # 验证

输出结果:

[ 5.  3. -2.]
[ 6. -4. 27.]
发布了51 篇原创文章 · 获赞 5 · 访问量 2010

猜你喜欢

转载自blog.csdn.net/MARS_098/article/details/103850831