Numpy是python中一个常用的库,其支持大量的维度数据与矩阵运算,也拥有针对数据运算的数学函数库,用于独特的数组存储方式及对应的处理方法。一般用以下方式导入:
import numpy as np #导入numpy库
一、数组创建及数组的数据类型
python中的数组其实与R中的数组基本上是一样的,如果为二维数组时就是我们日常说的矩阵了。而在python中,创建数组也有几种方式:
A = np.array([1,2,3]) # 一维数组
B = np.array([(1,2,3),(4,5,6)]) # 二维数组
C = np.array([[[1, 2, 3],[1, 2, 3]],[[1, 2, 3],[1, 2, 3]],[[1, 2, 3],[1, 2, 3]]]) # 多维数组
上面是普通的几种创建数组的方法,但是有时候我们对于数组的创建是有特殊的要求,比如我们要创建3X4的单位矩阵,5X5的空矩阵等等,所有我们有特殊的方法用于创建这些数组:
# 创建3X4元素为0的数组
a = np.zeros((3,4))
# 创建3X3单位矩阵
b = np.ones((3,3))
# 创建3x4的元素为1-12的数组
c = np.arange(1,13).reshape(3,4)
# 创建以1-24平均分成7段的8个端点数组
d = np.linspace(1,24,8)
# 创建以6为元素的5X6数组
e = np.full((5,6),6)
# 创建4X4的对角矩阵
f = np.eye(4)
# 创建以0-1中随机数为元素的2X2数组
g = np.random.random(2,2)
# 返回一个2X2的随机数数组
h = np.empty((2,2))
而数组的数据类型其实和python的数据类型基本一致,大概种类如下:
np.int64 / np.int32 #64/32位的整数
np.float32 / np.float64 #32/64位的浮点数
np.complex #复数
np.bool #逻辑值
np.object #项目
np.string_ #字符
# 指定数组数据类型
a = np.linspace(1,24,8,dtype = np.int32)
二、获取数组的信息
要想了解一个数组,就应该从其维度、大小、数据类型等等方法出发,下面就介绍一些方法帮助了解数组:
# 获取数组维度
A = np.array([(1,2,3),(4,5,6)])
A.shape
# 获取数组的长度
len(A)
# 获取数组的大小
A.size
# 获取数组的数据类型 / 返回数组的数据类型名称
A.dtype / A.type.name
# 返回数组的整体信息
np.info(A)
三、数组的基本运算及数学函数
数组的基本运算需要要求参与运算的数组的维度要一致,下面逐个介绍常用的基本运算:
A = np.array([(1,2,3),(5,8,9)])
B = np.array([(5,3,9),(2,8,5)])
# 加法
B+A
np.add(B,A)
#减法
B-A
np.substract(B,A)
#乘法
B*A
np.multiply(B,A)
#除法
B/A
np.divide(B,A)
# 矩阵乘法-矩阵A和B要符合aXb bXc的维度
np.dot(A,B)
# 其他的运算
np.exp(A) # 幂运算
np.sqrt(A) #平方根
np.sin(A) #正弦
np.cos(A) #余弦
np.log() #取自然对数
下面介绍数组中的数学函数,其实与python的math库中的一样,只是下面的为数组方法:
#首先 axis = 0 表示数组的行方向,axis = 1 表示数组的列方向,若数学函数指定axis参数,默认是全部元素
# 求和函数,按列求和
A = np.array([(1,2,3),(5,8,9)])
A.sum(axis = 1)
# 最小最大值
A.min() / A.max()
# 累加函数
A.cumsum()
# 均值、中位数、相关系数
A.mean()
A.median
A.corrcoef()
# 标准差
np.std(A)
四、数值元素的提取
#需要特别注意,python中数据的首个元素的下标是0
#提取单个元素
A = np.array([(1,2,3),(5,8,9)])
A[2] #值为3,数组元素的顺序是从左往右,按行的方向
# 提取第2行第3列的元素
A[1,2]
# 提取第一列的元素
A[:,0]
# 提取第一行的元素
A[0,:]
# 倒序提取行的元素
A[::-1]
#按条件提取元素,比如提取A中大于3的数据
A[A>3]
五、数组的操作函数
所谓的数组操作函数就是指操作对象是指整个数组而不是指数组中的某些元素,下面就简单介绍一下相关的数组操作函数:
A = np.array([(1,2,3),(5,8,9)])
# 重置数组的数据类型
C = A.astype(float)
# 比较两数组是否一致
np.array_equal(A,B)
# 复制矩阵,与使用"="不一样,"="赋值得到的新数组,当原数组发生改变时,新数组也会发生变化
B = A.copy()
B = np.copy(a)
# 排序(针对所有行或者列)
B = np.sort(A,axis = 1) / B = -np.sort(-A,axis = 1) #每行元素都按照升序/降序排序
B = np.sort(A,axis = 0) / B = -np.sort(-A,axis = 0) #每列元素都按照升序/降序排序
# 按照某一行后者列排序,使用参数order指定特定行或者列
# 数组转置
B = np.transpose(A)
B = A.T
# 将数组降至1维,flatten返回拷贝,修改不会影响原始矩阵;ravel返回的是视图修改会影响原始矩阵
np.ravel(A)
np.flatten(B)
# 重新定义数组维度,如果新数组比原数组大,resize会对原数组中的值对新数组进行填充,reshape则只会使用原数据
B = np.resize(3,4)
B = np.reshape(3,2)
#合并
A = np.array([(1,2,3),(5,8,9)])
B = np.array([(1,2,3),(5,8,9)])
C = np.append(A,B,axis = 0) / C = np.concatenate(A,B,axis = 0) / C = np.vstack(A,B) / C = np.r_(A,B) #按行合并
C = np.append(A,B,axis = 1) / C = np.concatenate(A,B,axis = 1) / C = np.hstack(A,B) / C = np.c_(A,B) #按列合并
#分裂数组
B = hsplit(A,3) # 按列方向,将数组A拆分成3列
B = vsplit(A,2) # 按列方向,将数组A拆分成2行
#删除行/列
C = np.delect(A,[1,2],axis = 1) #删除第二第三列
C = np.delect(A,[1,2],axis = 0) #删除第二第三行
#插入
A = np.array([(1,2,3),(5,8,9)])
np.insert(A,2,[5],axis = 1) # 第一参数是数组,第二参数是插入新值的位置,第三参数是插入的具体值,第四参数是插入方向
六、数据读取和导出
数组数据既可以从外部导入,也可以从python中导出,在读取或者导出数据时,我们可以借由OS库中的函数修改工作路径,方便我们的读写过程,比如将工作目录设置为桌面:
import os
os.chdir('C:\\Users\\Administrator\\Desktop')
如果我们需要读取路径中的txt文件或者csv文件,我们可以使用下面的方法,导入的数据形式是数组:
import numpy as np
a = np.loadtxt('data.txt')
b = np.genfromtxt('data1.csv',delimiter = ',')
同样地,如果我们需要将数据导出到工作目录时,可使用下面的方法:
A = np.array([(1,2,3),(5,8,9)])
# 导出txt数据
np.savetxt('data.txt',A,delimiter = " ")
# 导出csv数据
np.savetxt("data.csv", A, delimiter=',')