python学习笔记——Numpy库

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)

你可能感兴趣的:(python学习笔记——Numpy库)