Numpy 基本库 创建矩阵(采用 ndarray 对象) 对于 python 中的 numpy 模块,一般用其提供的 ndarray 对象。创建一个 ndarray 对象很简单只要将一个 list 作为参数即可。例如:
import numpy as np a = np.array([1 ,2 ,3 ,4 ,5 ]) a2 = np.array([[1 ,2 ,3 ,4 ,5 ],[6 ,7 ,8 ,9 ,10 ]])
获取矩阵行数列数(二维情况) 习惯了采用 matlab 进行数模的编程,要对矩阵进行遍历时,一般先获取矩阵的行数和列数。要获取 narray 对象的各维的长度,可以通过 narray 对象的 shape 属性,例如:
import numpy as np a = np.array([[1 ,2 ,3 ,4 ,5 ],[6 ,7 ,8 ,9 ,10 ]])print (a.shape) print (a.shape[0 ]) print (a.shape[1 ])
矩阵的截取 按行列截取 矩阵的截取与 list 相类似,都是可以通过[](方括号)来截取。例如:
import numpy as np a = np.array([[1 ,2 ,3 ,4 ,5 ],[6 ,7 ,8 ,9 ,10 ]])print (a[0 :1 ]) print (a[1 ,2 :5 ]) print (a[1 ,:])
按条件截取 按条件截取其实是在[](方括号)中传入自身的布尔语句。例如:
import numpy as np a = np.array([[1 ,2 ,3 ,4 ,5 ],[6 ,7 ,8 ,9 ,10 ]]) b = a[a>6 ] print (b) print (a>6 ) [[False False False False False ] [False True True True True ]]
按条件截取应用较多的是对矩阵中满足一定条件的元素变成特定的值。 例如将矩阵中大于 6 的元素变成 0。例如:
import numpy as np a = np.array([[1 ,2 ,3 ,4 ,5 ],[6 ,7 ,8 ,9 ,10 ]])print (a) [[ 1 2 3 4 5 ] [ 6 7 8 9 10 ]] a[a>6 ] = 0 print (a) [[1 2 3 4 5 ] [6 0 0 0 0 ]]
矩阵的合并 矩阵的合并可以通过 numpy 中的 hstack 方法和 vstack 方法实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import numpy as np a1 = np.array([[1 ,2 ],[3 ,4 ]]) a2 = np.array([[5 ,6 ],[7 ,8 ]])print (np.hstack([a1,a2])) [[1 2 5 6 ] [3 4 7 8 ]]print (np.vstack((a1,a2))) [[1 2 ] [3 4 ] [5 6 ] [7 8 ]]
矩阵的合并也可以通过 concatenate 方法。
np.concatenate( (a1,a2), axis=0 ) 等价于 np.vstack( (a1,a2) )
np.concatenate( (a1,a2), axis=1 ) 等价于 np.hstack( (a1,a2) )
通过函数创建矩阵 numpy 模块中自带了一些创建 ndarray 对象的函数,可以很方便的创建常用的或有规律的矩阵。
arange import numpy as np a = np.arange(10 ) print (a) a1 = np.arange(5 ,10 ) print (a1) a2 = np.arange(5 ,20 ,2 ) print (a2)
linspace linspace()和 matlab 的 linspace 很类似,用于创建指定数量等间隔的序列,实际生成一个等差数列。
import numpy as np a = np.linspace(0 ,10 ,7 ) print (a)
logspace linspace 用于生成等差数列,而 logspace 用于生成等比数列。 下面的例子用于生成首位是 100,末位是 102,含 5 个数的等比数列。
import numpy as np a = np.logspace(0 ,2 ,5 )print (a)
ones、zeros、eye、empty ones 创建全 1 矩阵 zeros 创建全 0 矩阵 eye 创建单位矩阵 empty 创建空矩阵(实际有值)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import numpy as np a_ones = np.ones((3 ,4 )) print (a_ones) [[ 1. 1. 1. 1. ] [ 1. 1. 1. 1. ] [ 1. 1. 1. 1. ]] a_zeros = np.zeros((3 ,4 )) print (a_zeros) [[ 0. 0. 0. 0. ] [ 0. 0. 0. 0. ] [ 0. 0. 0. 0. ]] a_eye = np.eye(3 ) print (a_eye) [ 1. 0. 0. ] [ 0. 1. 0. ] [ 0. 0. 1. ]] a_empty = np.empty((3 ,4 )) print (a_empty) [[0. 0. 0. 0. ] [0. 0. 0. 0. ] [0. 0. 0. 0. ]]
fromstring fromstring()方法可以将字符串转化成 ndarray 对象,需要将字符串数字化时这个方法比较有用,可以获得字符串的 ascii 码序列。
a = "abcdef" b = np.fromstring(a,dtype=np.int8) print (b)
fromfunction fromfunction()方法可以根据矩阵的行号列号生成矩阵的元素。 例如创建一个矩阵,矩阵中的每个元素都为行号和列号的和。
import numpy as npdef func (i,j ): return i+j a = np.fromfunction(func,(5 ,6 ))print (a) [[ 0. 1. 2. 3. 4. 5. ] [ 1. 2. 3. 4. 5. 6. ] [ 2. 3. 4. 5. 6. 7. ] [ 3. 4. 5. 6. 7. 8. ] [ 4. 5. 6. 7. 8. 9. ]]
矩阵的运算 常用矩阵运算符 numpy 中的 ndarray 对象重载了许多运算符,使用这些运算符可以完成矩阵间对应元素的运算。
运算符
说明
+
矩阵对应元素相加
-
矩阵对应元素相减
*
矩阵对应元素相乘
/
矩阵对应元素相除,如果都是整数则取商
%
矩阵对应元素相除后取余数
**
矩阵每个元素都取 n 次方,如**2:每个元素都取平方
例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import numpy as np a1 = np.array([[4 ,5 ,6 ],[1 ,2 ,3 ]]) a2 = np.array([[6 ,5 ,4 ],[3 ,2 ,1 ]])print (a1+a2) [[10 10 10 ] [ 4 4 4 ]]print (a1/a2) [[0 1 1 ] [0 1 3 ]]print (a1%a2) [[4 0 2 ] [1 0 0 ]]
常用矩阵函数 同样地,numpy 中也定义了许多函数,使用这些函数可以将函数作用于矩阵中的每个元素。 _表格中默认导入了 numpy 模块_,即 import numpy as np
a 为 ndarray 对象。
矩阵函数
说明
np.sin(a)
对矩阵 a 中每个元素取正弦,sin(x)
np.cos(a)
对矩阵 a 中每个元素取余弦,cos(x)
np.tan(a)
对矩阵 a 中每个元素取正切,tan(x)
np.arcsin(a)
对矩阵 a 中每个元素取反正弦,arcsin(x)
np.arccos(a)
对矩阵 a 中每个元素取反余弦,arccos(x)
np.arctan(a)
对矩阵 a 中每个元素取反正切,arctan(x)
np.exp(a)
对矩阵 a 中每个元素取指数函数,ex
np.sqrt(a)
对矩阵 a 中每个元素开根号 √x
例如:
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (np.sin(a)) [[ 0.84147098 0.90929743 0.14112001 ] [-0.7568025 -0.95892427 -0.2794155 ]]print (np.arcsin(a)) C:\Users\Administrator\Desktop\learn.py:6 : RuntimeWarning: invalid value encountered in arcsin print (np.arcsin(a)) [[ 1.57079633 nan nan] [ nan nan nan]]
当矩阵中的元素不在定义域范围内,会产生 RuntimeWarning,结果为 nan(not a number)。
矩阵乘法(点乘) 矩阵乘法必须满足矩阵乘法的条件,即第一个矩阵的列数等于第二个矩阵的行数。 矩阵乘法的函数为 dot 例如:
import numpy as np a1 = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]]) a2 = np.array([[1 ,2 ],[3 ,4 ],[5 ,6 ]]) print (a1.shape[1 ]==a2.shape[0 ]) print (a1.dot(a2)) [[22 28 ] [49 64 ]]
矩阵的转置 aT import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.transpose()) [[1 4 ] [2 5 ] [3 6 ]]
矩阵的转置还有更简单的方法,就是 a.T
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.T) [[1 4 ] [2 5 ] [3 6 ]]
矩阵的逆 求矩阵的逆需要先导入numpy.linalg
,用 linalg 的 inv 函数来求逆。 矩阵求逆的条件是矩阵的行数和列数相同。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 import numpy as npimport numpy.linalg as lg a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ],[7 ,8 ,9 ]])print (lg.inv(a)) [[ -4.50359963e+15 9.00719925e+15 -4.50359963e+15 ] [ 9.00719925e+15 -1.80143985e+16 9.00719925e+15 ] [ -4.50359963e+15 9.00719925e+15 -4.50359963e+15 ]] a = np.eye(3 ) print (lg.inv(a)) [[ 1. 0. 0. ] [ 0. 1. 0. ] [ 0. 0. 1. ]]
矩阵信息获取(如平均值) 最大最小值 获得矩阵中元素最大最小值的函数分别是max
和min
,可以获得整个矩阵、行或列的最大最小值。 例如:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.max ()) print (a.min ()) print (a.max (axis=0 ))print (a.max (axis=1 ))print (a.argmax(axis=1 ))
平均值 获得矩阵中元素的平均值可以通过函数mean()
。同样地,可以获得整个矩阵、行或列的平均值。
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.mean()) print (a.mean(axis=0 )) print (a.mean(axis=1 ))
方差 方差的函数为var()
,方差函数var()
相当于函数mean(abs(x - x.mean())**2)
,其中 x 为矩阵。
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.var()) print (a.var(axis=0 )) print (a.var(axis=1 ))
标准差 标准差的函数为std()
。std()
相当于sqrt(mean(abs(x - x.mean())**2))
,或相当于sqrt(x.var())
。
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.std()) print (a.std(axis=0 )) print (a.std(axis=1 ))
中值 中值指的是将序列按大小顺序排列后,排在中间的那个值,如果有偶数个数,则是排在中间两个数的平均值。
例如序列[5,2,6,4,2],按大小顺序排成 [2,2,4,5,6],排在中间的数是 4,所以这个序列的中值是 4。
又如序列[5,2,6,4,3,2],按大小顺序排成 [2,2,3,4,5,6],因为有偶数个数,排在中间两个数是 3、4,所以这个序列中值是 3.5。
中值的函数是 median(),调用方法为 numpy.median(x,[axis]),axis 可指定轴方向,默认 axis=None,对所有数去中值。
import numpy as np x = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (np.median(x)) 3.5 print (np.median(x,axis=0 )) [ 2.5 3.5 4.5 ]print (np.median(x,axis=1 )) [ 2. 5. ]
求和 矩阵求和的函数是 sum(),可以对行,列,或整个矩阵求和
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.sum ()) print (a.sum (axis=0 )) print (a.sum (axis=1 ))
累积和 某位置累积和指的是该位置之前(包括该位置)所有元素的和。
例如序列[1,2,3,4,5],其累计和为[1,3,6,10,15],即第一个元素为 1,第二个元素为 1+2=3,……,第五个元素为 1+2+3+4+5=15。
矩阵求累积和的函数是 cumsum(),可以对行,列,或整个矩阵求累积和。
import numpy as np a = np.array([[1 ,2 ,3 ],[4 ,5 ,6 ]])print (a.cumsum()) print (a.cumsum(axis=0 )) [[1 2 3 ] [5 7 9 ]]print (a.cumsum(axis=1 )) [[ 1 3 6 ] [ 4 9 15 ]]