numpy学习
注意本文是连贯执行的,分割线只是为了划分不同内容
import numpy as np
使用numpy时需要将对应的数组转化为numpy数组格式
array=np.array([1,2,3,4,5])
此后我们如果想要对于数组中的所有元素进行加C,或者是减C的操作就可以直接使用'+'、'-'运算。
array+=1 #array=[1,2,3,4,5]
print(array) #array=[2,3,4,5,6]
同样type[height,width]的数组也可以直接进行加减
array+=array #老版本array=[2,3,4,5,6],新版本array=[4,6,8,10,12]
array是一个数组,所以也可以根据索引取出特定位置的值
print(array[0]) #4
想要查看array的维度,可以下面代码获得
print(array.shape) #(5,)
也可以声明多维数组
array=np.array([[1,2,3],[4,5,6]])
完整代码如下:
import numpy as np
array=np.array([1,2,3,4,5])
array+=1
print(array)
array+=array
print(array)
print(array.shape)
array=np.array([[1,2,3],[4,5,6]])
---------------------------------------------------------------------------------------------------------------------------------
numpy在数组中数据格式不一致的条件下,会隐式的进行数据的转换。一般是int<float<string
c=np.array([1,2,3,4,5.0])
print(c) #[1.,2.,3.,4.,5.]
print(c.dtype) #float64
c=np.array([1,2,3,4,5.0,'lrx'])
print(c) #['1' '2' '3' '4' '5.0' 'lrx']
print(c.dtype) #<U32 Unicode 字符串
可以通过以下代码获取数组大小
print(array.size) #5
如果数组中都是一个元素可用,由此可见对于全部是数字不会主动向下转类型。
c.fill(0) #['0','0','0','0','0']
print(c)
---------------------------------------------------------------------------------------------------------------------------------二维数组中,我们可以快速的取出来某一行或者列:
不用numpy也可以快速取出来某一行,但是通过第二种方法取出来某一列
c=np.array([[1,2,3],[4,5,6]])
print(c[1]) #[4 5 6]
print(c[:,1]) #[2 5]
通过一个中括号便可以完成索引
print(c[1,1]) #5
快速构建等差数列,第一个参数是st,从哪里开始,第二个参数是ed在哪里结束(不包含),最后一个是步长。
c=np.arange(0,10,1)
print(c) #[0 1 2 3 4 5 6 7 8 9]
通过bool数组来索引,c>5返回bool索引,再用索引数组去找到对应的值,通过where找下标
print(c>5) #[False False False False False False True True True True]
print(c[c>5]) #[6 7 8 9]
print(np.where(c>5)) #(array([6, 7, 8, 9], dtype=int64),)
--------------------------------------------------------------------------------------------------------------------------------
numpy求和运算
分为两种情况,一种我们想要求取所有元素的和,还有一种情况我们想要按照某个维度进行求和运算。
print(c.sum()) #整体求和 21
print(c.sum(axis=0)) #按照列进行求和 [5,7,9]
print(c.sum(axis=1)) #按照行进行求和 [6,15]
axis在不指定的时候默认指代的是最后一个轴,其中axis可以这么理解,axis=i,代表我的第i维度变化的那个方向,比方说0,就是第一个维度变化的方向进行求和,行发生变化的情况就是列,所以就是按列进行求和。同理还有其他像max,mean,min、std、var的用法在这里就不一一解释。默认情况下axis=-1,也就是按照最后一个下标变化的方向进行运算。
--------------------------------------------------------------------------------------------------------------------------------
numpy排序
c=np.array([[3,2,1],[6,5,4]])
print(np.argsort(c)) #[[2 1 0],[2 1 0]],也就是获取每个位置排好序之后的位置
c=np.sort(c) #默认是最后一个轴,所以排序后是
print(c) #[[1 2 3],[4 5 6]]
按照多个维度依次排序,掉用lexsort方法,其中要注意是先按照最后一个进行排序,然后再按照倒数第二个进行排序,返回的就是对应的索引值。默认是从小到大排序,如果想要从大到小就可以使用-1*c[:,2]的方式进行排序。在下面的代码中,我们使用的就是按照列进行排序,首先是按照最后一列进行排序,然后按照倒数第二列进行排序。
c=np.array([[1,0,6],[1,7,0],[2,3,1],[2,4,0]])
print(np.lexsort([c[:,1],c[:,2]])) #[3 1 2 0]
--------------------------------------------------------------------------------------------------------------------------------
numpy之改变数组形状,可以直接对shape属性进行值得修改,但是一定要保证,shape在修改前后不会丢失或者增加元素,也就是说经过shape改变之后得元素总量要和之前得元素总量要一致。
c=np.arange(0,10,1)
c.shape=2,5
print(c) #[[0 1 2 3 4],[5 6 7 8 9]]
c=c.reshape(1,10) #[[0 1 2 3 4 5 6 7 8 9]]
采用某些其他方法可以对数据添加新的轴
c=np.arange(0,10,1)#[0 1 2 3 4 5 6 7 8 9]
c=c[np.newaxis,:] #[[0 1 2 3 4 5 6 7 8 9]]
print(c.shape) #(1, 10)
但是我们在上面这个新加一个轴是没有意义的,所以有下面去掉没有意义的轴的操作。
c=c.squeeze() #[0 1 2 3 4 5 6 7 8 9]
支持的矩阵运算
T代表矩阵的转置
concatenate代表连接,其中我们可以规定按照哪个轴进行连接,这里默认的轴应该是axis=0,其中vstack就是垂直连接,也就是按照axis=0进行连接,hstack就是水平连接。flatten()操作把对应的数据压缩成一维的。
c=np.array([[3,8,2],[6,1,3],[1,3,4]])
print(c.T) #[[3 6 1],[8 1 3],[2 3 4]]
print(np.concatenate((c,c))) #[[3 8 2],[6 1 3],[1 3 4],[3 8 2],[6 1 3],[1 3 4]]
print(np.concatenate((c,c),axis=-1))#[[3 8 2 3 8 2],[6 1 3 6 1 3],[1 3 4 1 3 4]]
print(np.vstack((c,c)))#[[3 8 2],[6 1 3],[1 3 4],[3 8 2],[6 1 3],[1 3 4]]
print(np.hstack((c,c)))#[[3 8 2 3 8 2],[6 1 3 6 1 3],[1 3 4 1 3 4]]
print(c.flatten()) #[3 8 2 6 1 3 1 3 4]
--------------------------------------------------------------------------------------------------------------------------------
numpy中的数组生成函数
在之前我们就已经讨论过arange函数,下面主要讨论以下其他的生成函数。
c=np.linspace(0,50,50) #也是起点是0,终点是50(包含),选出来50个数满足等差数列
c=np.zeros(10) #构造出一个一维10个0
c=np.ones(10) #构造出一个一维10个1
c=np.ones(10)*5 #构造出其他常数c=np.ones(size)*k(k是任意常数)
c=np.ones(10,dtype=np.float64) #指定类型
d=np.arange(0,9,1).reshape(3,3)
c=np.ones_like(d) #构造出和b同结构的数组
print(c)
--------------------------------------------------------------------------------------------------------------------------------
numpy中的一些运算
a=np.array([[1,2],[3,4]])
b=np.array([[1,2],[3,4]])
c=np.multiply(a,b) #[[ 1 4],[ 9 16]]也就是对应项目相乘
c=np.dot(a,b) #30 对应项相乘再像加,二维进行矩阵乘法,一维度进行点积然后进行求和
--------------------------------------------------------------------------------------------------------------------------------
numpy中的一些随机化操作
c=np.random.normal(mu,sigma,(3,3)) #构造一个符合(0,1)正态分布的3*3的矩阵
#[[ 0.10286577 0.89525654 -1.37307021]
#[-1.24950757 -1.39620678 1.5106422 ]
#[-1.03780423 0.43334007 -0.1592555 ]]
idx=np.arange(0,10,1)
print(idx) #[0 1 2 3 4 5 6 7 8 9]
np.random.shuffle(idx) #[6 5 3 4 8 9 2 1 0 7] 随机打乱
print(idx)
有的时候我们希望在运行程序的时候进行调试,但是每次随机化数据不方便我们进行调试,那么我们可以采用固定随机化种子的方法进行初始化操作。
np.random.seed(0) #设定好对应的随机化种子
mu,sigma=0,0.1
print(np.random.normal(mu,sigma,10)) #生成的数据就是固定的
--------------------------------------------------------------------------------------------------------------------------------
其他的一些numpy的一些操作
c=np.ones((5,5))
c=np.pad(c,pad_width=2,mode='constant',constant_values=0) #在外面包二圈0
如果调试过程中发现数组打印不全,可能是
c=np.ones((10,10))
c=np.pad(c,pad_width=2,mode='constant',constant_values=0)
np.set_printoptions(threshold=1) #设置打印阈值,会导致数组打印不全
#设置np.set_printoptions(threshold=np.nan)来显示所有打印信息
print(c)
z=[1,1,2,3,4,5,6,6,7,7,8,8,1]
print(np.bincount(z)) #从0到最大的值每个数出现了几次,结果:[0 3 1 1 1 1 2 2 2]