学习Numpy的基本操作

一:Numpy简介

NumPy是一个开源的Python科学计算库,Numerical Python简写。主要功能之一是用来操作数组和矩阵,是科学计算、深度学习等高端领域的必备工具。NumPy这个词来源于两个单词---Numerical和Python。NumPy提供了大量的库函数和操作,可以帮助程序员轻松地进行数值计算。

这类数值计算广泛用于以下任务:

机器学习模型:在编写机器学习算法时,需要对矩阵进行各种数值计算。例如矩阵乘法、换位、加法等。NumPy提供了一个非常好的库,用于简单(在编写代码方面)和快速(在速度方面)计算。NumPy数组用于存储训练数据和机器学习模型的参数。

图像处理和计算机图形学:计算机中的图像表示为多维数字数组。NumPy成为同样情况下最自然的选择。实际上,NumPy提供了一些优秀的库函数来快速处理图像。例如,镜像图像、按特定角度旋转图像等。

数学任务:NumPy对于执行各种数学任务非常有用,如数值积分、微分、内插、外推等。因此,当涉及到数学任务时,它形成了一种基于Python的MATLAB的快速替代。

二:数组创建

ndim-维度,shap-行数和列数,size-元素个数 

1:#numpy 数组的创建

#numpy数组的创建
a=np.array([2,3,4],dtype=np.int32)#一维数组的创建[2 3 4]
a=np.array([[1,2,3],[2,3,4]])#多维数组的创建[[1 2 3] [2 3 4]]
a=np.zeros((2,4))#创建全零数组[[0. 0. 0. 0.] [0. 0. 0. 0.]]
a=np.ones((3,4),dtype=np.int)#创建全一数组,同时指定数据类型[[1 1 1 1] [1 1 1 1] [1 1 1 1]]
a=np.empty((3,4))#创建全空数组,每个数接近于0
a=np.arange(1,10,2)#1-10的数据,步长为2,创建连续数组[1 3 5 7 9]

a=np.array([2,3,4],dtype=np.int32)
print(a.ndim)#1  维
print(a.shape)#(3,)
print(a.size)#3  元素个数

2:#创建两个1维矩阵

#创建两个1维矩阵
a=np.array([1,2,3,4])#[1 2 3 4]
b=np.arange(4)#[0 1 2 3]
c1=a-b #对应相减
c2=a*b #对应相乘
c3=a.dot(b) #对应相乘再求和<dot()返回两个数组的点积>
c4=b**2 #相应位置平方
c5=np.sin(a) #数学函数工具求sin

3:#创建2个多维矩阵

#创建2个多为矩阵
a=np.array([[1,1],[0,1]])
b=np.arrange(4).reshape((2,2))#reshape()重新命名该矩阵的行和列
c1=a.dot(b) #矩阵乘a*b<dot()返回两个数组的点积>
a=np.random.random((2,4)) #创建2*4的随机数矩阵
np.sum(a) #矩阵中数之和
np.min(a) #矩阵中最小的值
np.mean(a) #矩阵中元素的平均值
np.sum(a,axis=0) #按列进行求和
np.sum(a,axis=1) #按行进行求和

4:#矩阵基本计算

#矩阵基本计算
A=np.arange(2,14).reshape((3,4)) #创建一个3*4的矩阵2-13
np.argmin(A) #最小值元素索引0
np.argmax(A) #最大值元素索引11
np.mean(A) #整个矩阵的均值7.500000<对于mean,也表示平均数,但它既可以是算术平均,也可以是几何平均,或在概率和统计中,随机变量的期望值,即随着样本数的无限增加(如果存在极限),样本均值趋向集中到的一个极限值.>
np.average(A) #平均数7.5<对于average,表示平均,平均数;一般水平,一般标准.所以是种算术平均>
A.mean() #7.5
np.median(A) #中位数7.5
np.cumsum(A) #累加,每个位置的数是前边位置的和[2 5 9 14 20 27 35 44 54 65 77 90]
np.diff(A) #累差运算[[1 1 1 ] [1 1 1] [1 1 1]]

 5:#转置

A=np.arange(14,2,-1).reshape((3,4)) #[[14 13 12 11] [10 9 8 7] [6 5 4 3]]
print(np.sort(A)) #只是对每行进行递增排序[[11 12 13 14] [7 8 9 10] [3 4 5 6]]
print(np.transpose(A)) #矩阵转置
print(A.T) #[[14 10 6] [13 9 5] [12 8 4] [11 7 3]]
print(A) #[[14 13 12 11] [10 9 8 7] [6 5 4 3]]
print(np.clip(A,5,9)) #[[9 9 9 9] [9 9 8 7] [6 5 5 5]]

numpy.clip(a, a_min, a_max, out=None)

参数说明 

  • a : 输入的数组
  • a_min: 限定的最小值 也可以是数组 如果为数组时 shape必须和a一样
  • a_max:限定的最大值 也可以是数组 shape和a一样
  • out:剪裁后的数组存入的数组

6:#索引和切片

A=np.arange(3,15) #[3 4 5 6 7 8 9 10 11 12 13 14]
B=A.reshape(3,4) #[[3 4 5 6] [7 8 9 10] [11 12 13 14]]
B[2] #[11 12 13 14]
B[0][2] #5
B[1,1:3] #输出第一行的第1和2位置的元素,也即[8,9]\
B[0:2,1:3] #输出第0行和第1行的第1位置和第二位置的元素
#打印行
for row in B:
    print(row)
#打印列
for columns in B.T:
    print(columns) 
A=np.arange(3,15).reshape((3,4))
print(A.flatten()) #多维数组变成一维(显示),A本身不变

7:#数组合并

A=np.array([1,1,1])
B=np.array([2,2,2])
np.vstack((A,B)) #vertical stack 上下合并[[1 1 1] [2 2 2]]
np.hstack((A,B)) #hstack() 左右合并 [1 1 1 2 2 2]
b=np.array([[0,1,2,3,4,5],[6,7,8,9,10,11]])
c=b*2 np.dstack((b,c)) #深度合并
#array([[[0,0],[1,2],[2,4],[3,6],[4,8],[5,10]],[[6,12],[7,14],[8,16],[9,18],[10,20],[11,22]]])

8:#多个矩阵合并

#多个矩阵合并
A=np.array([1,1,1])
B=np.array([2,2,2])
A=A[:,np.newaxis] #数组转置[[1] [1] [1]]
B=B[:,np.newaxis] #数组转置[[2] [2] [2]]
#纵向合并
C1=np.concatenate((A,B),axis=0)#[[1] [1] [1] [2] [2] [2]]
#横向合并
C2=np.concatenate((A,B),axis=1)##[[1 2] [1 2] [1 2]]

9:#数组拆分

#构造矩阵
A=np.arange(12).reshape((3,4)) #[[0 1 2 3] [4 5 6 7] [8 9 10 11]]
#沿横向轴拆分(axis=1)
np.hsplit(A,2) #[array([[0,1],[4,5],[8,9]]),array([[2,3],[6,7],[10,11])]
np.split(A,2,axis=1) #同上
#沿纵向轴拆分 (axis=0)
np.vsplit(A,3) #[array([[0,1,2,3]]),array([[4,5,6,7]]),array([[8,9,10,11]])]
np.split(A,3,axis=0) #同上
#深度合并
b=np.array([[0,1,2,3,4,5],[6,7,8,9,10,11]])
c=b*2
arr_dstack=np.dstack((b,c)) #array([[[0,0],[1,2],,,[5,10]][[6,12],,,,[11,22]]])
#深度拆分
np.dsplit(arr_dstack,2) #[array([[[ 0],[ 1],,,[ 5]],[[ 6],,,[11]]]),
array([[[ 0],,,[ 10]],[[12],,,[22]]])]

10:#copy与=

#=号赋值的关联性
a=np.arange(4) #[0 1 2 3]
b=a
a[0]=11 #a中元素发生改变,b中的元素同样变化
print(a) #[11 1 2 3]
print(b) #[11 1 2 3]
b[1:3]=[11 12 13 3] #b中元素发生变化,a中的元素同样变化
print(a) #[11 12 13 3]
print(b) #[11 12 13 3]

#copy()赋值没有关联性
a=np.arange(4)
b=a.copy()
a[3]=44
print(a) #[0 1 2 44]
print(b) #[0 1 2 3]

11:#广播机制

numpy在算数运算期间处理不同形状的数组的能力,对数组的算术运算通常在相应的元素中进行。

当数组跟一个标量进行计算时,标量需要根据数组的形状进行扩展,然后执行运算。该扩展过程称为“广播”

a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
b=np.array([0,1,2])
print(a+b) #a,b的维度不一样,在进行计算的时候会将b广播后计算
#[[0 1 2] [10 11 12] [20 21 22] [30 31 32]]

#相当于将b重复多次
b=np.tile([0,1,2],(4,1)) #b行重复4次,列重复1次.tile<他的功能是重复某个数组>
print(a+b)

12:常用数组

#bincount()计算索引出现次数
x=np.array([1,2,3,3,0,1,4,0]) #x中最大数为4,那么bin中统计的索引只能为0-4的5个数字,统计他们在x中出现的次数
print(np.bincount(x))


w=np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1,0.2])
print(np.bincount(x,weights=w)) #[0.3 -0.6 0.5 1.3 1.]

print(np.bincount(x,weights=w,minlength=7)) #bincount中元素为5个,当设置长度为7时,后边两位设为0 #[0.3 -0.6 0.5 1.3 1. 0. 0.]

#argmax
x=[[1,3,3],[7,5,2]]
print(np.argmax(x)) #返回最大元素中的位置3
print(np.argmax(x,axis=0)) #按列操作返回最大元素的索引位置[1 1 0]
print(np.argmax(x,axis=1)) #按行操作返回最大元素的索引位置,对于同为最大值,返回第一个的位置索引即可[1 0]
print(np.around([-0.6,1.2789,9.67,13],decimals=0)) #[-1. 1. 2. 10. 13.]
print(np.around([1.2798,2.357,9.67,13],decimals=1)) #[1.3 2.4 9.7 13.]
print(np.around([1.2798,2.357,9.67,13],decimals=2)) #decimals指定保留有效数的位数[1.28 2.36 9.67 13.]
print(np.around([1,2,5,6,56],decimals=-1)) #-1表示看最后一位数决定是否进位,大于5进位,小于5省区#[0 0 0 10 60]
print(np.around([1,2,5,6,56],decimals=-2)) #-2表示看最后两位数决定是否进位,大于50进位,小于50省去#[0 0 0 0 100]

#向下取整
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7]) #array([-1., -2., -1., -2., 0., 1., 1.])

#向上取整
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3]) #array([ 2., 2., 2., 3., 2., -0., -0., -0.])
发布了40 篇原创文章 · 获赞 4 · 访问量 5180

猜你喜欢

转载自blog.csdn.net/worewolf/article/details/96272854