numpy是Python用于矩阵计算的模块,下面对numpy作详细介绍:
一、创建
import numpy as np
# 用列表对象作参数
a = np.array([1,2,3,4,5])
# 创建多维的narray对象
a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]])
# arange函数
a = np.arange(10) # 默认从0开始到10(不包括10),步长为1
print(a) # 返回 [0 1 2 3 4 5 6 7 8 9]
a1 = np.arange(5,10) # 从5开始到10(不包括10),步长为1
print(a1) # 返回 [5 6 7 8 9]
a2 = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2
print(a2) # 返回 [ 5 7 9 11 13 15 17 19]
# linspace()和matlab的linspace很类似,用于创建指定数量等间隔的序列,实际生成一个等差数列。
# 生成首位是0,末位是10,含7个数的等差数列
a = np.linspace(0,10,7)
# linspace用于生成等差数列,而logspace用于生成等比数列。
a = np.logspace(0,4,5)
print(a)
[ 1.00000000e+00 1.00000000e+01 1.00000000e+02 1.00000000e+03
1.00000000e+04]
# 创建3*4的全1矩阵
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.]]
# 创建3阶单位矩阵
a_eye = np.eye(3)
print(a_eye)
[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
a_empty = np.empty((3,4)) # 创建3*4的空矩阵
print(a_empty)
二、访问
# 获取二维矩阵的行列数
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
print(a.shape) # 结果返回一个tuple元组 (2, 5)
print(a.shape[0]) # 获得行数,返回 2
print(a.shape[1]) # 获得列数,返回 5
print(a[::-1]) # 行逆置
print(a[0:1]) # 返回 [[1,2,3,4,5]]
print(a[1,2:5]) # 返回 [8,9,10]
print(a[1,:]) # 截取第二行,返回 [ 6,7,8,9,10]
print(a[1:,2:]) # 截取第一行之后,第2列之后内容,返回[8,9,10]
# 按条件获取
a = np.array([[1,2,3,4,5],[6,7,8,9,10]])
b = a[a>6] # 截取矩阵a中大于6的元素,返回的是一维数组
print(b) # 返回 [ 7 8 9 10]
print(a[a<3]=0)
# 首先生成一个布尔矩阵,将布尔矩阵传入[](方括号)实现截取
print(a>6)
# 返回
[[False False False False False]
[False True True True True]]
三、矩阵合并
a1 = np.array([[1,2],[3,4]])
a2 = np.array([[5,6],[7,8]])
# 注意! 参数传入时要以列表list或元组tuple的形式传入
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]]
# 矩阵的合并也可以通过concatenatef方法。np.concatenate( (a1,a2), axis=0 ) 等价于 np.vstack( (a1,a2) )
# np.concatenate( (a1,a2), axis=1 )等价于 np.hstack( (a1,a2) )
四、fromstring和fromfunction
# fromstring()方法可以将字符串转化成ndarray对象,可以获得字符串的ascii码序列
a = "abcdef"
b = np.fromstring(a,dtype=np.int8) # 因为一个字符为8为,所以指定dtype为np.int8
print(b) # 返回 [ 97 98 99 100 101 102]
# fromfunction()方法可以根据矩阵的行号列号生成矩阵的元素。例如创建一个矩阵,矩阵中的每个元素都为行号和列号的和。
def func(i,j):
return i+j
a = np.fromfunction(func,(5,6)) # 第一个参数为指定函数,第二个参数为列表list或元组tuple,说明矩阵的大小
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.]]
五、矩阵的运算
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中每个元素开根号
# 矩阵乘法 np.dot()
a1 = np.array([[1,2,3],[4,5,6]]) # a1为2*3矩阵
a2 = np.array([[1,2],[3,4],[5,6]]) # a2为3*2矩阵
if a1.shape[1]==a2.shape[0]): # True, 满足矩阵乘法条件
print(a1.dot(a2))
print(np.dot(a1,a2))
# 矩阵转置
a = np.array([[1,2,3],[4,5,6]])
print(a.transpose())
print(a.T)
[[1 4] [2 5] [3 6]]
# 用linalg的inv函数来求逆,条件是矩阵的行数和列数相同
import numpy as np
import 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) # 3阶单位矩阵
print(lg.inv(a)) # 单位矩阵的逆为他本身
[[ 1. 0. 0.]
[ 0. 1. 0.]
[ 0. 0. 1.]]
六、其它计算
二维数组转一维
a.ravel()
# 求最大最小值max,min
a = np.array([[1,2,3],[4,5,6]])
print(a.max()) # 获取整个矩阵的最大值 结果: 6
print(a.min()) # 结果:1
# 可以指定关键字参数axis来获得行最大(小)值或列最大(小)值
print(a.max(axis=0))
[4 5 6]
print(a.max(axis=1))
[3 6]
# 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得
print(a.argmax(axis=1))
[2 2]
# 平均值mean(),方差var(),标准差std()
print(a.mean())
print(a.mean(axis=0))
print(a.mean(axis=1))
print(a.var())
print(a.var(axis=0))
print(a.var(axis=1))
print(a.std())
print(a.std(axis=0))
print(a.std(axis=1))
# 中值median(),是将序列按大小顺序排列后,排在中间的那个值,如果有偶数个数,则是排在中间两个数的平均值
# 中值的函数是median(),调用方法为 numpy.median(x,[axis]),axis可指定轴方向,默认axis=None,对所有数去中值
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()和累积和cumsum()
print(a.sum())
print(a.sum(axis=0))
print(a.sum(axis=1))
# 某位置累积和指的是该位置之前(包括该位置)所有元素的和
a = np.array([[1,2,3],[4,5,6]])
print(a.cumsum())
[ 1 3 6 10 15 21]
print(a.cumsum(axis=0)) # 对行方向求累积和
[[1 2 3]
[5 7 9]]
print(a.cumsum(axis=1)) # 对列方向求累积和
[[ 1 3 6]
[ 4 9 15]]