[转载]numpy操作大全

https://www.cnblogs.com/Yanjy-OnlyOne/p/12499395.html

numpy.array基础模块介绍与使用

import numpy
import numpy as np #导入numpy模块
print(np.version) #输出numpy的版本

将列表转换为二维数组mxn数组

L=[[1,2,3],[1,3,1]] #先定义好list列表,将其转换为numpy.array
L=numpy.array(L)
print(L)

array是指限定版的列表,元素类型是规定好的

import array
a=array.array("i",[i for i in range(10)])
print(a)
a[5]=100
print(a)

numpy.array是专门为矩阵和向量设定专门的函数

n1=np.array([i for i in range(10)])
print(n1)
print(n1[5])
n1[5]=100
print(n1)
print(n1.dtype) #输出数据的类型,默认为64位的整型数据类型
np1=np.array([1,2,3.1415926]) #根据创建隐形的转换定义数据类型,机器学习中一般都是浮点型
print(np1.dtype)

其他创建numpy.array的方法

创建元素均为0的数组,默认为浮点型数据

print(np.zeros(10))
print(np.zeros(10).dtype) #默认为float浮点型数据
print(np.zeros(10,dtype=int))

创建一个3x5的二维数组

print(np.zeros((3,5),dtype=int))
print(np.zeros(shape=(3,5),dtype=int))

创建全是1的矩阵

print(np.ones((3,5),dtype=int))

创建一个全是某一个特定元素的矩阵,默认为输入特定元素的数据类型

print(np.full((3,5),666)) #默认参数输入
print(np.full(fill_value=666,shape=(3,5))) #规定元素输入

arange()函数

print([i for i in range(0,20,2)]) #包含0,从0开始,不包含20,第三个参数为步长
print(np.arange(0,20,2)) #从0-20步长为2的数组
print(np.arange(10)) #默认开始为0,步长为1

linspace函数

print(np.linspace(0,20,10)) #包含0和20,第三个参数的含义是包含数字的个数
print(np.linspace(0,20,11))

random函数

print(np.random.randint(0,10)) #包含0,不包含10
print(np.random.randint(0,10,10))

生成随机整数的二维随机矩阵

print(np.random.randint(0,10,size=(3,5))) #生成一个随机矩阵3x5,二维矩阵
print(np.random.randint(0,10,size=(3,5))) #生成一个随机矩阵3x5,二维矩阵

指定随机种子,可以使得随机矩阵产生是一致的

np.random.seed(666)
print(np.random.randint(0,10,size=(3,5))) #生成一个随机矩阵3x5,二维矩阵
np.random.seed(666)
print(np.random.randint(0,10,size=(3,5))) #生成一个随机矩阵3x5,二维矩阵

生成随机浮点数的二维矩阵

print(np.random.random(size=(3,5))) #生成一个随机矩阵3x5,二维矩阵,数据我0-1的随机浮点数

生成一个均值为0,方差为1的正态分布浮点数random.normal(均值,方差,size矩阵形式)

print(np.random.normal())
print(np.random.normal(0,1,size=(3,5)))

numpy矩阵基本属性操作

x=np.arange(15).reshape(3,5) #重新定义矩阵的形状
print(x)
print(x.ndim) #ndim是指数组的维数,二维数组
print(x.shape) #输出元素的形状,行和列数目
print(x.size) #输出数组的数字数目

numpy数据访问与切片操作

向量数据访问,一维数组

x=np.random.random((3,5))
X=np.arange(10)
print(x)
print(x[2][2]) #输出某一行某一列的元素
print(x[2,2]) #直接使用一个方括号进行访问

一维向量数据的切片操作

print(X[0:5]) #输出前5个元素
print(X[:5])
print(X[5:]) #输出从第5个元素开始的所有元素
print(X[::2]) #间隔2个元素输出
print(X[::-1]) #倒序输出数组

二维数组的切片操作,一般不可以使用[a][b]双括号索引,一般需要使用[a,b]索引切片

x=np.random.randint(0,100,size=(3,5))
print(x)
print(x[:2][:3])
print(x[:2,:3]) #标准切片
print(x[::-1,::-1]) #行和列倒置

取出第一行

print(x[0])
print(x[0,:])
print(x[0,:].ndim)

取出第一列

print(x[:,0])
subx=x[:2,:3] #前2行前3列
print(subx)

直接切片,修改子矩阵的元素,可以使得原来矩阵的元素改变,子矩阵与原矩阵元素保持改变一致

subx[0,0]=100
print(subx)
print(x)

使用copy方法可以使得子矩阵与原来矩阵的改变关系脱离,子矩阵改变,原矩阵不变

subx=x[:2,:3].copy()
subx[0,0]=123456
print(subx)
print(x)
print(x.shape)

reshape函数用来直接重新定义形状

X1=X.reshape(2,5)
print(X1)
B=X.reshape(1,10) #一行十列的二维数组,X是一维向量
print(B.shape)
print(B)

只想指定元素的行数reshape(行数,-1)

C=X.reshape(10,-1) #只想指定元素的行数reshape(10,-1),则可以得到10行1列的二维数组
print(C)

只需要指定元素的列数reshape(-1,列数)

D=X.reshape(-1,5)
print(D)

numpy的合并和分割操作函数

1-1合并操作函数np.concatenate([x,y]))

x=np.array([1,2,3])
y=np.array([3,2,1])
print(x)
print(y)

列合并操作

print(np.concatenate([x,y]))
z=np.array([666,666,666])
print(np.concatenate([x,y,z]))

特征不变,列不变,合并行即样本数目

A=np.array([[1,2,3],[4,5,6]])
B=np.array([[1,2,3],[1,2,3],[1,2,3]])
print(np.concatenate([A,B]))

行不变,样本数目不变,特征增加,列变化

print(np.concatenate([A,A],axis=1))

z=z.reshape(1,-1) #将一维向量进行二维转化

print(np.concatenate([A,z.reshape(1,-1)]))

1-2 np.vstack/hstack函数,更加方便

print(np.vstack([A,z]))#垂直方向上叠加
print(np.hstack([A,A]))#水平方向上叠加

分割操作

2-1一维数据分割,指定分割起始的索引号即可np.split(A,[a,b,c...])

x=np.arange(10)
print(x)
print(np.split(x,[3,7])) #将向量分割为三段,传入两位
print(np.split(x,[5])) #分割为两段

二维分割,矩阵分割操作np.split(A,[x]))默认是基于行维度上分割

A=np.arange(16).reshape([4,4])
print(np.split(A,[3])) #3是指在第三行上分割

在列的方向上进行分割需要指定axis=1,即np.split(A,[x],axis=1))

print(np.split(A,[2],axis=1)) #在列的方向上进行分割

2-2分割函数np.hsplit水平左右分割和np.vsplit函数垂直上下分割

left,right=np.hsplit(A,[2])
print(left,right)
print(np.vsplit(A,[3])) #获取数据的特征值前n-1的行
X,y=np.hsplit(A,[-1]) #分割取得最后一行的目标值
print(X)
print(y)

numpy矩阵运算

矩阵的各种混合函数运算

n=10
L=[i for i in range(n)]
print(L)
A=[]
for i in L:
A.append(2*i)
print(A)

A=np.array(2*e for e in L)

L=np.array(L) #转换为矩阵,直接可以运算
print(2L)
X=np.arange(1,16).reshape(3,5)
print(X)
print(X+1)
print(X-1)
print(X
2)
print(X/2)
print(np.sin(X))
print(np.power(3,X))
print(np.log(X))
print(np.exp(X))
print(np.log2(X))

矩阵之间的运算

A=np.arange(4).reshape(2,2)
B=np.full((2,2),10)

矩阵各个位置元素之间加减乘除

print(A+B)
print(A-B)
print(A*B)
print(A/B)

3-1 矩阵真实乘法,转置

print(A.dot(B)) #矩阵相乘
print(A.T) #矩阵转置

3-2 向量和矩阵之间的运算

v=np.array([1,2])
print(v+A)
print(np.tile(v,(2,2)))#将v向量进行堆叠,行方向上堆叠2次,列方向堆叠2次
print(np.tile(v,(2,1))+A) #将v向量进行堆叠,行方向上堆叠2次,列方向堆叠1次,之后与A相加
print(v)
print(v*A) #元素相乘
print(v.dot(A)) #矩阵相乘
print(A.dot(v)) #将v自动当做列向量进行使用

3-3矩阵的逆矩阵np.linalg.inv(A),矩阵必须为方针

print(np.linalg.inv(A))
invA=np.linalg.inv(A)
print(A.dot(invA)) #矩阵与逆矩阵的乘积为单元矩阵

对于不是方阵的矩阵,一般求得伪逆矩阵np.linalg.pinv(x)

x=np.arange(16).reshape(2,8)
print(np.linalg.pinv(x))
print(x.dot(np.linalg.pinv(x)))

矩阵的聚合运算与统计学参数输出,最大,最小,求和,中位数,平均值等操作

x=np.random.random(100)
print(x)
print(sum(x))
print(np.sum(x)) #效率更高,时间更短,np.max方法比较广泛更全
print(np.max(x))
print(np.min(x))
print(x.max())
print(x.min())
print(x.sum())
x=x.reshape(25,-1)
print(x)
print(np.sum(x,axis=0)) #矩阵每一列求和
print(np.sum(x,axis=1)) #矩阵每一行求和
print(np.prod(x)) #矩阵所有元素乘积
print(np.mean(x,axis=0)) #求取平均值
print(np.median(x,axis=0)) #求取中位数
X=np.array([1,1,2,2,10])

np.percentile(X,q=50)百分占比函数输出

print(np.percentile(X,q=50)) #输出50%的元素都是小于等于的值,与中位数等效
print(np.median(X))
print(np.max(X))
print(np.percentile(X,q=100)) #与最大值等效
x=np.random.normal(0,1,100000) #正态分布,均值为0,标准差为1的正态分布数据
print(np.mean(x)) #输出均值
print(np.std(x)) #输出标准差

numpy输出向量或者矩阵对应的索引运算

print(np.argmin(x)) #输出最小值的索引号
print(np.min(x))
print(x[np.argmin(x)])
print(np.argmax(x)) #输出最大值的索引

排序使用索引

x=np.arange(16)
np.random.shuffle(x)
print(x)
print(np.sort(x)) #排序之后x不变
print(x)
print(np.argsort(x)) #输出排序之后的索引
x.sort() #排序之后x发生改变
print(x)
print((np.partition(x,3))) #5左边的数比5小,右边的数比5大
print(np.argpartition(x,3)) #输出比3小的数的索引分布,左边为小于3的索引,右边为大于3的索引

二维矩阵的排序操作与索引操作

x=np.random.randint(1,10,size=(3,4))
print(x)
print(np.argmax(x,axis=0)) #二维矩阵最大索引输出列索引号
print(np.argsort(x,axis=1)) #按照行排序的索引
print(np.sort(x,axis=0)) #按照列排序
print(np.argsort(x,axis=0)) #按照列排序的索引
print(np.argpartition(x,2,axis=0)) #列方向上看,行方向上压缩

numpy中fancy indexing

一维向量索引数据

x=np.arange(16)
print(x)
print(x[3])
print(x[3:9:2]) #等步长索引
ind=[3,5,8] #建立索引列表即可访问
print(x[ind]) #直接访问不等步长的索引号数据
ind=np.array([[0,2],[2,4]])
print(x[ind])

二维矩阵索引

print(x.reshape(4,-1))
x=x.reshape(4,-1)
row=np.array([0,1,2])
col=np.array([1,2,2]) #行和列的索引组合,便可以直接访问元素
print(x[row,col])
print(x[:2,col]) #前2行的数据,输出感兴趣的列索引数据
print(x[0,col])
col=[True,False,True,True]
print(x[1:3,col])
print(x>3)
print(x<3)
print(x>=5) #比较运算符输出对应的false or true
print(x)
print(np.sum(x<=3)) #输出大于3的元素的个数,即将True作为1来看
print(np.count_nonzero(x<=3)) #输出小于等于3的数据个数
print(np.any(x==0)) #判断是否存在0
print(np.any(x<0))
print(np.all(x>0)) #是否都大于0
print(np.sum(x%2==0)) #求取偶数的个数
print(np.sum(x%2==0,axis=0))#看列
print(np.sum(x%2==0,axis=1))#看行
print(np.all(x>0,axis=1))
print(np.any(x>0,axis=1))
print(np.sum((x>3) & (x<6))) #并且条件,使用位运算符可以输出,不可以使用条件语句
print(np.sum((x%2==0) | (x>10))) #或条件
print(np.sum(~(x==0))) #非条件,统计非0的数据数目
print(x[x<5])
print(x[x%2==0])

条件判断语句,可以输出想要输出的任何数据

print(x[x[:,3] % 3==0,:]) #输出第三索引列数据可以被3整除的所有行和列数据

pandas模块可以方便实现表格数据的预处理操作


Numpy与List之间的转换

说明:在做NLP的时候,经常需要查看当前数组数据的维度,也就是data.shape,而List是没有这个属性的,因此需要先将其转换成Numpy,以下为两者户想转换的方法

  1. List转Numpy:numpy.array(list)
  2. Numpy转List:array.tolist()

你可能感兴趣的:([转载]numpy操作大全)