Numpy包常用科学计算方法总结

numpy包的计算性能是python原始方法计算性能的几十倍到几百倍

一、引入numpy包:                                                                                                                         

import numpy as np

 二、创建数组:

#定义一个python的List
list = [1,2,3]
#将python的List包装成numpy的array:
array = np.array(list)
#array的类型为numpy.ndarray:
type(array)  #numpy.ndarray
#array数组的维度是:
array.ndim # 1维数组,几维数组就返回几
#array的形状;
array.shape #(1,3) 代表1行3列

#array变形:
array.reshape(3,1) #将array改成3行1列。需要注意的是,reshape参数不能随便写,必须基于原有的数组,做有意义的变换,如何写的参数不对,基于array的原有数据不能进行reshape,会报错。

三、利用np创建测试数据

#设置随机种子,设置成固定值后,np每次生成的随机数都是固定不变的
np.random.seed(1)
#生成随机数数组
np.random.randint(low = 0,high = 101,size=10)#表示生成从0(low)到100(不好含high)随机数数组,数组长度是10

np.random.randint(low = 0,high = 101,size = (2,5,3))#表示生成从0(low)到100(不好含high)随机数数组,生成的是一个三维数组,第一个维度有两个特征,第二个维度有5个特征,第三个维度有3个指标。可以这么形象的理解: 有两个班,每个班有5个学生,每个学生有3门课程。如何用数组表示两个班每个学生3门课程的成绩呢,就是这个表达式

incides = np.arange(num) #生成0至(num-1)个顺序数字的数组
np.random.shuffle(incides ) #将顺序数组打乱

 四、np常用计算公式

#np中array加减乘除一个数,都是在数组中每个元素上进行加减乘除这个数,如:
array = np.random.randint(low = 0,size = 101,size = (2,3))
#array([[91, 33, 38],[10, 77, 99]])
array+1
#array([[ 92,  34,  39],[ 11,  78, 100]])
array**2 # 平方
#array([[8281, 1089, 1444],[ 100, 5929, 9801]])
np.abs(array) #求每个元素的绝对值
np.sqrt(array) #求每个元素的开平方根
np.sin(array) #求每个元素的sin的值    
array.sum(axis=0) #求array数组求和,axis=0代表求x轴总和,即各行的元素纵向相加,axis=1代表求y轴总和,即横向求和。默认不写则求所有元素的和。
#例如:
a = np.array([[1,2,3],[4,5,6]])
a.sum()  #所有元素求和,21
a.sum(axis=0) # 求x轴的和,即每行的x轴对应相加,为array([5, 7, 9])
a.sum(axis=1) #求y轴的和,即横向相加构成y轴的一个值,为array([ 6, 15])

array.mean()# 求平均值,参数同sum()方法

array.std() #求标准差,参数同sum()

 五、向量与向量之间的计算

1. 向量的大小(向量的模)

a:[x1,x2,......xn]  公式:

:

#例如: 
array = np.array([[1,2,3],[4,5,6]])
#求各元素的平方和:
a= (array**2).sum(axis=0)
# 再开根号就是array向量的模
np.sqrt(a)



#以上是手动求解,np提供了直接的求模方法:  linalg是线性处理数据的工具包,就是线性代数相关的功能
np.linalg.norm(array)

2.求两个向量的内积

公式:(a:[x1,x2,......xn]  b:[y1,y2......yn]) (疑问: 多维数组的a和b如何表示呢?)

a = np.array([1,2,3])
b = np.array([4,5,6])
#内积的三种写法:
a @ b
a.dot(b)
np.dot(a,b)

内积的含义:

3.求两个向量的余弦相似度

由上面公式可知,余弦相似度取值范围是[-1,1],是内积公式的变形。余弦相似度是两个向量的夹角,夹角越小越相似。

a = np.array([1,2,3])
b = np.array([4,5,6])
#余弦相似度:
a @ b /(np.linalg.norm(a)*np.linalg.norm(b))

4.求两个向量的欧式距离

公式: d = sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2 +....)

表示两个向量之间的距离,距离越小,越相似

a = np.array([4,5,6])
b = np.array([1,2,3])
np.sqrt((a-b)**2)

5. 方差、标准差公式

6. broadcast 广播机制

两个同维度的向量加减乘除运算可以直接对位运算。对于不同维度的两个向量,能否直接运算,需要看低维度的向量能否通过广播机制转成高维度的向量。所谓的广播机制就是通过复制行和列,使两个向量对齐,然后进行加减乘除计算。

7. 两个矩阵求内积

上面讲到两个向量求内积,是对应位置相乘再相加,那么两个矩阵之间如何求内积呢?两个矩阵要求内积,必须满足的条件是A矩阵(m行n列)与B矩阵(n行l列)中,必须n=n,即一个向量的列必须等于另一个向量的行,这样求出的结果为m行l列,如下图所示:

注意这是求内积的方法,与上述广播机制要区分。广播机制是求加减乘除的方法,即两个向量可以求内积,但是不一定可以求加减乘除。

8. 将一个向量转置(行转列)

三种表示方式:

A.T
A.transpose()
np.transpose(a=A)

9. 求一个矩阵的逆矩阵:

所谓逆矩阵,即 设A是一个n阶矩阵,若存在另一个n阶矩阵B,使得: AB=BA=,则称方阵A可逆,并称方阵B是A的逆矩阵。注意,不是所有的矩阵都存在逆矩阵。AB指得是求A和B的内积。E指的是一个对角线为1,其他元素都为0的矩阵。

# 求A矩阵的逆矩阵
np.linalg.inv(A)

#验证
np.allclose(np.linalg.inv(A) @ A, np.eye(5)) # True代表两个向量互逆

六、练习应用 

现在有50个同学,每个同学3门课程成绩,用np随机生成50名同学的成绩数组:

array = np.random.randint(low = 0,high = 101,size = (50,3))

求三号同学的第2门成绩:

array[2,1]

取出所有语文成绩不及格的同学:

#获取所有行所有列的写法:
array[:,:] # 第一个:代表所有行,第二个:代表所有列
#获取语文成绩小于60的学生成绩,也就是所有行是语文成绩小于60,列是所有列,写法如下:
array[array[:,0]<60,:]

找出所有语文成绩及格但是英语成绩不及格的学生:

array[(array[:,0]>60 & array[:,2]<60),:]

所有学生,所有成绩的平均分:

array.mean

所有学生,每门课程的平均分,标准差:

array.mean(axis=0)
array.std(axis=0)

猜你喜欢

转载自blog.csdn.net/qq1309664161/article/details/132684835