python种numpy包是用于进行矩阵相关的计算,本篇笔记将从矩阵及属性,生成矩阵,访问元素,矩阵运算,矩阵合并,矩阵分割,矩阵赋值七个方面介绍矩阵的基本用法。
1.矩阵与其属性
构建一个numpy矩阵并访问其属性
import numpy as np array = np.array([[1,2,3],[2,3,4]]) #构建一个二维矩阵 print(array) ##基本属性 print('number of dim',array.ndim) #维度 print('shape:',array.shape) #形状,几行几列 print('size:',array.size) #元素个数
运行结果:
[[1 2 3] [2 3 4]] number of dim 2 shape: (2, 3) size: 6
ps. 矩阵可分为一维矩阵与二维矩阵
import numpy as np a = np.array([1,2,3,4]) print(a.ndim) print(a.shape) b = np.array([[1,2,3,4]]) print(b.ndim) print(b.shape)
运行结果:
1 (4,) 2 (1, 4)
2.构建numpy矩阵的方法
a = np.array([2,3,4],dtype=np.int) ###dtype:np.int64 np.int32 np.float64 np.float32 (位数越小占用空间越小,精度越差) print(a) print(a.dtype) a = np.array([[1,2,33],[2,3,44]]) #直接以二维数组的形式生成矩阵 print(a) a = np.zeros((3,4)) #生成所有元素都是0的矩阵 print(a) a = np.ones((3,4)) #生成所有元素都是1的矩阵 print(a) a = np.empty((3,4), dtype=np.float32) #当dtype为float时,每个元素的数值都很小,当dtype为int时,每个元素都为1 print(a) a = np.arange(10,30,2).reshape((2,5)) #生成序列数的矩阵 print(a)
运行结果:
[2 3 4] int32 [[ 1 2 33] [ 2 3 44]] [[0. 0. 0. 0.] [0. 0. 0. 0.] [0. 0. 0. 0.]] [[1. 1. 1. 1.] [1. 1. 1. 1.] [1. 1. 1. 1.]] [[7.071444e-39 7.255112e-39 7.346949e-39 7.255119e-39] [7.530610e-39 7.071424e-39 6.704089e-39 6.336756e-39] [5.602082e-39 5.326553e-39 7.346969e-39 1.019390e-38]] [[10 12 14 16 18] [20 22 24 26 28]]
3.矩阵的运算
矩阵的运算与R语言中矩阵的运算符号规则类似,但在numpy中矩阵的乘法分为数学乘法和矩阵点乘两种。
a = np.array([10,20,30,40])
b = np.arange(4)
print(a)
print(b)
print('*'*30)
###运算
c = a - b
print('a - b : {0}'.format(c))
c = a + b
print('a + b : {0}'.format(c))
c = b**2 #乘方
print('b^2 : {0}'.format(c))
c = np.sin(a)
print('sin(a) : {0}'.format(c))
print('b < 3 : ',b < 3)
print('b == 3 : ',b==3)
print('\n\n')
a = np.array([[1,1],[0,1]])
b = np.arange(4).reshape((2,2))
print(a)
print(b)
print('*'*30)
c = a * b ###元素一一相乘
print('a * b :\n{0}'.format(c))
c_dot = np.dot(a,b) ###矩阵的乘法,写法等价于 a.dot(b)
print('a . b :\n{0}'.format(c_dot))
print('*'*30)
a = np.random.random((2,4)) ###随机生成一个矩阵,维度为2行4列
print(a)
print('sum:',np.sum(a))
print('sum in row:',np.sum(a,axis=1)) #求行和
print('sum in col:',np.sum(a,axis=0)) #求列和
print('max:',np.max(a))
print('min:',np.min(a))
print('mean:',np.mean(a)) ###等价于 a.mean()
print('average:',np.average(a))
运行结果:
[10 20 30 40] [0 1 2 3] ****************************** a - b : [10 19 28 37] a + b : [10 21 32 43] b^2 : [0 1 4 9] sin(a) : [-0.54402111 0.91294525 -0.98803162 0.74511316] b < 3 : [ True True True False] b == 3 : [False False False True] [[1 1] [0 1]] [[0 1] [2 3]] ****************************** a * b : [[0 1] [0 3]] a . b : [[2 4] [2 3]] ****************************** [[0.53350219 0.21520172 0.46648373 0.32288226] [0.78381529 0.71279036 0.38545227 0.7198446 ]] sum: 4.1399724090944385 sum in row: [1.5380699 2.60190251] sum in col: [1.31731747 0.92799208 0.851936 1.04272686] max: 0.7838152868296081 min: 0.21520172072824184 mean: 0.5174965511368048 average: 0.5174965511368048
其他运算方法
A = np.arange(2,14).reshape((3,4)) print(A) print(np.argmin(A)) ###最小值所在的索引值 print(np.argmax(A)) print(np.median(A)) print(np.cumsum(A)) ###累加值 print(np.diff(A)) ###每两个数之间的差值 print(np.nonzero(A)) ###输出值为非零值的位置,第一个array为行所在的索引,第二个array为列所在的索引 print(np.sort(A)) ###逐行进行排序 print(np.transpose(A)) ###转置 print(A.T) print(np.clip(A,5,9)) ###截取,A中的数值,小于5的都被替换为5,大于9的都被替换为9
运行结果:
[[ 2 3 4 5] [ 6 7 8 9] [10 11 12 13]] 0 11 7.5 [ 2 5 9 14 20 27 35 44 54 65 77 90] [[1 1 1] [1 1 1] [1 1 1]] (array([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2], dtype=int64), array([0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3], dtype=int64)) [[ 2 3 4 5] [ 6 7 8 9] [10 11 12 13]] [[ 2 6 10] [ 3 7 11] [ 4 8 12] [ 5 9 13]] [[ 2 6 10] [ 3 7 11] [ 4 8 12] [ 5 9 13]] [[5 5 5 5] [6 7 8 9] [9 9 9 9]]
4.矩阵元素访问--索引
对于一维矩阵,索引方法为在中括号中加上元素所在的位置(相当于R语言种的向量),对于二维矩阵,索引方法为在中括号中以两个数字访问其位置(相当于R语言中的矩阵)。
A = np.arange(3,15) print(A[3]) ###一维矩阵的索引方法 A = np.arange(3,15).reshape((3,4)) print(A[1][1]) ###二维矩阵的索引方法 print(A[1,1]) ###同上 print(A[2]) ###取出第三行 print(A[2,]) ###同上 print(A[2,:]) ###同上 print(A[:,2]) ###取出第三列 print(A[1:3,1:3]) ###取出某一个子集 ###遍历行 print('*'*30) for row in A: print(row) ###遍历列 print('*'*30) for coloum in A.T: print(coloum) ###遍历每一个元素 print('*'*30) print(A.flatten()) for i in A.flat: print(i)
运行结果:
6 ****************************** [[ 3 4 5 6] [ 7 8 9 10] [11 12 13 14]] 8 8 [11 12 13 14] [11 12 13 14] [11 12 13 14] [ 5 9 13] [[ 8 9] [12 13]] ****************************** [3 4 5 6] [ 7 8 9 10] [11 12 13 14] ****************************** [ 3 7 11] [ 4 8 12] [ 5 9 13] [ 6 10 14] ****************************** [ 3 4 5 6 7 8 9 10 11 12 13 14] 3 4 5 6 7 8 9 10 11 12 13 14
5.合并矩阵
按行合并:numpy.vstack()
按列合并:numpy.hstack()A = np.array([1,1,1])B = np.array([2,2,2])
A = np.array([1,1,1]) B = np.array([2,2,2]) print(A) print(B) ###按行合并 C = np.vstack((A,B)) print(C) ###按列合并 D = np.hstack((A,B)) print(D) #一维矩阵转二维矩阵的方法 print(A.shape) print(A[np.newaxis,:].shape) ###将一维矩阵的行赋予新的维度 print(A[:,np.newaxis].shape) ###将一行的矩阵的列赋予新的维度 print(A[:,np.newaxis]) A = np.array([1,1,1])[:,np.newaxis] B = np.array([2,2,2])[:,np.newaxis] C = np.concatenate((A,B,B,A),axis=1) print(C)
运行结果:
[1 1 1] [2 2 2] [[1 1 1] [2 2 2]] [1 1 1 2 2 2] (3,) (1, 3) (3, 1) [[1] [1] [1]] [[1 2 2 1] [1 2 2 1] [1 2 2 1]]
6.分割矩阵
numpy.split(MA, num, axis)方法可以将矩阵分割为多个子集,接受三个参数,分别为矩阵名称MA,分割为几部分num,维度axis(1行2列)
numpy.array_split()方法可以将矩阵分割为维度不同的子集
numpy.hsplit():矩阵水平方向分割为不同子集
numpy.vsplit():矩阵垂直方向分割为不同子集
A = np.arange(12).reshape(3,4) print(A) print(np.split(A,2,axis=1)) ###将array分割的每一行都分割为两部分,分割的每一部分维度都要相同 print(np.array_split(A,3,axis=1)) ###将array分割的每一行都分割为三部分,分割的每一部分维度可以相同 print(np.hsplit(A,2)) ###将array分割为水平的两个部分 print(np.vsplit(A,3)) ###将array分割为垂直的三个部分
运行结果
[[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11]] [array([[0, 1], [4, 5], [8, 9]]),
array([[ 2, 3], [ 6, 7], [10, 11]])] [array([[0, 1], [4, 5], [8, 9]]),
array([[ 2], [ 6], [10]]),
array([[ 3], [ 7], [11]])] [array([[0, 1], [4, 5], [8, 9]]),
array([[ 2, 3], [ 6, 7], [10, 11]])] [array([[0, 1, 2, 3]]),
array([[4, 5, 6, 7]]),
array([[ 8, 9, 10, 11]])]
7.矩阵的赋值
直接使用A = B的方法,其指向内存中的数据是同一份数据
使用numpy.copy()方法可将矩阵的值复制并产生新的内存地址
A = np.arange(4) print(A) B = A C = A D = B print(A,B,C,D) A[0] = 11 print(A,B,C,D) ###以上这种赋值方法,改变其中一个对象的时候所有对象的值都会改变 print('*'*30) A = np.arange(4) B = np.copy(A) print(A,B) A[0:3] = [11,22,33] print(A,B) ###以上这种赋值方法不会改变B的值, deep copy
运行结果:
[0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3] [0 1 2 3] [11 1 2 3] [11 1 2 3] [11 1 2 3] [11 1 2 3] ****************************** [0 1 2 3] [0 1 2 3] [11 22 33 3] [0 1 2 3]