Numpy是一个第三方python库,用于科学计算,前身是1995年开始开发的一个用于数组运算的库。
Numpy数组存储在一个均匀连续的内存块中,数组元素遍历所有的元素不需要像python中分散存储的list结构一样,对内存地址进行查找,大大节省内存空间。
1.引用
import numpy as np
2.创建数组
import numpy as npa=np.array([[1,2,3,4],[2,3,5,8],[2,5,6,8]])
b=np.arange(6).reshape(2,3)
print(a)
print(a.shape)
print(b)
print(b.shape)
#结果
[[1 2 3 4][2 3 5 8]
[2 5 6 8]]
(3, 4)
[[0 1 2]
[3 4 5]]
(2, 3)
先导入numpy库,记为np,然后a是通过array将序列转换为ndarray对象,b是先通过arange(n)创建一个一维数组然后在使用reshape(a, b)改变维度,变成依次生成n个自然数的a行b列的形式的二维数组。
通过shape属性获得数组大小,通过dtype属性可获得元素属性,size属性可获取数组元素个数,ndim可以获取数组维度。
a=np.array([[1,2,3,4],[2,3,5,8],[2,5,6,8]])
print(a)
print(a.shape)
print(a.size)
print(a.ndim)
print(a.dtype)
# [[1 2 3 4]
# [2 3 5 8]
# [2 5 6 8]]
# (3, 4)
# 12
# 2
# int32
arange(初始值,终值,步长)可以创建等差数组的一维数组,默认不包括终值。
·创建填充0的数组:numpy.zeros()-参数表示维数
·创建填充为1的数组:np.ones()
·创建填充初始内容随机数组(取决于内存状态):np.empty((a,b),c)——a为行数,b为列数,c为指定值
·创建对角为1的数组:np.eye()
·创建指定间隔内均匀间隔数字的一维数组:np.linspace(a,b,num=c)——a为起始值,b为结束值,c为数组元素个数
zero = np.zeros((2,4))
print(zero)
one = np.ones((2,4))
print(one)
emp = np.empty((3,3))
print(emp)
ful = np.full((3,4),3)
print(ful)
eyes = np.eye(3,3)
print(eyes)
array = np.linspace(0,10,num=5)
print(array)
[[0. 0. 0. 0.]
[0. 0. 0. 0.]]
[[1. 1. 1. 1.]
[1. 1. 1. 1.]]
[[0.00e+000 0.00e+000 0.00e+000]
[0.00e+000 0.00e+000 3.14e-321]
[0.00e+000 0.00e+000 0.00e+000]]
[[3 3 3 3]
[3 3 3 3]
[3 3 3 3]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
[ 0. 2.5 5. 7.5 10. ]
3.random模块:
包含随机数产生合同及分布相关的基本函数。
①随机生成[0,1)范围的数:np.random.random()
②随机生成高斯分布的概率密度随机数:np.random.normal(startvalue,endvalue,(维数))
ran = np.random.random((2,4))
print(ran)
ran1 = np.random.normal(0,10,(2,4))
print(ran1)
[[0.34482091 0.12131755 0.5098051 0.89801917]
[0.00938639 0.68121558 0.21738956 0.92591899]]
[[ 0.97383067 -2.18110761 12.93532422 11.11133372]
[ 3.89121931 -0.09452442 3.84108881 13.25680942]]
4.切片操作
①一维数组:list[(start):(end):(step)]
②二维数组:list[(start1):(stop1):(step1),(start2):(stop2):(step2)]——逗号前面代表行,逗号后面代表列
a=np.full((8,8),0)
print(a)
a[0::2,1::2]=1
print(a)
a[1::2,0::2]=1
print(a)
[[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]
[0 0 0 0 0 0 0 0]]
[[0 1 0 1 0 1 0 1]
[0 0 0 0 0 0 0 0]
[0 1 0 1 0 1 0 1]
[0 0 0 0 0 0 0 0]
[0 1 0 1 0 1 0 1]
[0 0 0 0 0 0 0 0]
[0 1 0 1 0 1 0 1]
[0 0 0 0 0 0 0 0]]
[[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]
[0 1 0 1 0 1 0 1]
[1 0 1 0 1 0 1 0]]
5.数组的统计方法
①对数组中全部或某轴向元素求和:sum
也可以用list.sum(axis=n)——n=0或1,n=0时表示列向相加,n=1时表示横向相加
a=np.arange(0,11,2).reshape(2,3)
print(a)
su=np.sum(a)
s=np.sum(a[0,:])
s1 = np.sum(a[:,1])
s2 = np.sum(a[:,0:2])
print(su)
print(s)
print(s1)
print(s2)
[[ 0 2 4]
[ 6 8 10]]
30
6
10
16
②算数平均数,零长度数组的mean为NaN:mean
a=np.arange(0,11,2).reshape(2,3)
print(a)
mean1=np.mean(a)
print(mean1)
[[ 0 2 4]
[ 6 8 10]]
5.0
③标准差:std
④方差:var
a=np.arange(0,11,2).reshape(2,3)
print(a.std())
print(a.var())
3.415650255319866
11.666666666666666
⑤最大值max;最小值min
a=np.array([1,2,3,4])
print(a.max())
print(a.min())
#4
#1
⑥最大索引argmax;最小索引argmin
a=np.array([1,2,3,4])
print(a.argmax())
print(a.argmin())
3
0
⑦元素的累加cumsum;元素的累积cumprod
返回一个数组,每一个元素是与前一个元素累加的结果
a=np.array([1,2,3,4,5])
print(a.cumsum())
print(a.cumprod())
#[ 1 3 6 10 15]
#[ 1 2 6 24 120]
7.线性代数
①向量加减
②矩阵点乘和元素乘积
A=np.arange(4).reshape(2,2)
B=np.arange(2,6).reshape(2,2)
print(A)
print(B)
print(A*B)
print(A.dot(B))
[[0 1]
[2 3]]
[[2 3]
[4 5]]
[[ 0 3]
[ 8 15]]
[[ 4 5]
[16 21]]
③矩阵转置
A=np.arange(6).reshape(2,3)
print(A)
print(A.T)
[[0 1 2]
[3 4 5]]
[[0 3]
[1 4]
[2 5]]
8.np.linalg模块
①计算逆矩阵:(矩阵必须是方阵且可逆)设A是数域上一个n阶矩阵,若在相同数域上存在另一个n阶矩阵,使得AB=BA=E,则称为B是A的逆矩阵,而A则称为可逆矩阵。——E是单位矩阵
x=np.lianlg.inv(A)
验证:A*inv=E
#计算逆矩阵
a = np.mat("0 1 2;1 0 3;4 -3 8")
#mat可以从字符串或列表中生成;array只能从列表中生成
b = np.array([[0,1,2],[1,0,3],[4,-3,8]])
inv = np.linalg.inv(a)
inv1 = np.linalg.inv(b)
print(a)
print(inv)
print(b)
print(inv1.dot(b))#验证
[[ 0 1 2]
[ 1 0 3]
[ 4 -3 8]]
[[-4.5 7. -1.5]
[-2. 4. -1. ]
[ 1.5 -2. 0.5]]
[[ 0 1 2]
[ 1 0 3]
[ 4 -3 8]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
②解线性方程组(Ax=b的线性方程)——A是矩阵,x是未知变量,b是一维或二维数组
x=np.linalg.solve(A,a)
验证:np.dot(A,x)=a
A=np.mat("1 -2 1;0 2 -8;-4 5 9")
b=np.array([0,8,-9])
print(A,b)
print(np.linalg.solve(A,b))
print(A.dot(np.linalg.solve(A,b)))
[[ 1 -2 1]
[ 0 2 -8]
[-4 5 9]] [ 0 8 -9]
[29. 16. 3.]
[[ 0. 8. -9.]]
③特征值和特征向量:
设A是n阶方阵,如果数a和n维非零列向量x使关系式Ax=ax成立,那么这样的数a称为矩阵A特征值,非零向量x称为A的对应于特征值λ的特征向量。Ax=ax也可写成( A-aE)X=0。非零解的充分必要条件是系数行列式| A-aE|=0
A=np.mat("3 -2;1 0")
a=np.linalg.eigvals(A)
print(a)
[2. 1.]
④计算矩阵的Mooer-Penrose伪逆
pinv函数没有只接受方阵作为输入矩阵的限制
np.linalg.pinv(A)
⑤行列式
np.linalg.det(A)