numpy常用操作
矩阵运算
- * 表示按元素相乘
- @ 表示按矩阵相乘,或使用A.dot(B)
- 使用不同类型的数组进行操作时,结果数组的类型应为更一般或更精确的类型(称为向上转换),数值型字符串传送给float64类型的数组时,类型会自动转换成float64。当建立一个np.array时,如果有字符串,有数字,数字会转换成字符串,如果有混合类型,自动转换成其中最高级别类型。
矩阵索引
- 一维数组可以进行索引、切片、迭代,像list一样
- 多维数组一个轴有一个索引,用逗号隔开,当索引数量少于轴的数量时,会被认为是完整的切片。
- 若有多个轴,可以使用...代替,如x是5个轴的矩阵,
x[1,2,...]
相当于x[1,2,:,:,:],x[...,3]
等效于x[:,:,:,:,3],x[4,...,5,:]
等效于x[4,:,:,5,:]
花式索引,索引可以是一维数组,可以是多维数组(每个数组为第一维的索引)
布尔索引,在属性分配中很有用
矩阵视图
# 不同的数组对象可以共享相同的数据
c = a.view() # a和c共享数据,都可以改变
c.base is a # True
c.flag.owndata # False
# 切片返回视图
s = a[:,0] # 改变s的值会改变a值,如果不使用a了,应在后面加.copy(),这样del a时a就可以释放内存了,否则del a也不会删除a
# 深拷贝
d = a.copy() # d是a的完整副本
Mat类型
mat类型和2维以上ndarray类型不可使用set(),会报错不可哈希,TypeError: unhashable type: 'matrix'。一维ndarray类型可以哈希
a.A # 转成数组
a.A1 # 转成一维数组
创建矩阵
np.array([1,2]) # 创建数组,不能传多个元素,也可以传序列
np.zeros((size)) # 0数组
np.ones((size)) # 1数组
np.empty((size)) # 空数组,内容随机
np.eye(size) # 单位矩阵
np.arange(0,10,1) # 产生数字数组,类似于range(), 不过返回数组而不是列表
np.linspace(0,1,10) # 划分一个范围
np.r_[1:10,11,12] # 创建一个行,允许使用范围操作符:,行为类似于vstack
np.c_[1:10,1:10] # 创建多个列,但是数量要一致,行为类似于hstack
a[:,np.newaxis] # 创建新轴,若a是1维,返回列矩阵
ax,bx,cx = np.ix_(a,b,c) # ax,bx,cx 都是三维数据,查看shape,result = ax+bx*cx的矩阵即使a+b*c的值
形状操作
a.reshape(size) # 重排矩阵,若将size设为-1,则自动计算其他size的大小。也可以直接对a.shape赋值
a.resize(size) # 重排矩阵,改变原矩阵,返回None
a.reshape(-1) # 返回一维新数组
a.ravel() # 返回一维新数组
np.hstack((a, b)) # 矩阵合并,水平合并,等效于column_stack(())
np.vstack((a, b)) # 矩阵合并,垂直合并,等效于row_stack(())
np.hsplit(a,n) # 矩阵拆分,水平拆分为n个,a的列要可以分成n个
np.hsplit(a,(c1,)) # 矩阵拆分,水平在c1出拆分,c1为0则会拆出来一个空矩阵
np.vsplit
np.split(a,(c1,),axis=1) # 沿行拆分,作用同np.hsplit()
np.tile(a, (size)) # 复制矩阵
矩阵方法和数学函数:
a.shape # 数组形状
a.size # 元素总数
a.ndim # 轴的个数(维度)
a.sum(axis=0) # 求和,默认求所有元素的和
a.cumsum(axis=0) #累加求和
a.min(axis=0) # 最小值
a.max(axis=0) # 最大值
a.argmax(axis=0) # 最大值,返回索引
a.argsort(axis=0) # 排序,返回索引,默认axis=1对每一行排序
np.argsort(a,axis=0) # 排序,返回索引,对某一列排序可以先用某一列排序返回索引,再用索引查所有数据
np.nonzero(a) # 返回一个元组,为非零索引,2维矩阵返回包含两个array的元组([0,1],[2,1])表示在位置[0,2]和[1,2]处非零。或a.nonzero()
a.flat # 返回迭代器,矩阵中所有元素的迭代器,用于循环所有元素
a.T # 转置
a.transpose() # 转置
np.trace(a) # 求迹
# 这些函数对数组元素进行运算,产生一个数组作为输出
np.sin(a) # sin函数
np.exp(a) # 指数
np.exp2(a) # 底数为2的指数
np.log(a) # a的对数,底数为10
np.log2(2)
np.sqrt(a) # 开方
np.floor(a) # 向下取整
np.var(a) # 方差,或a.var()
np.pi # pi
np.inf # 无穷
# 线性代数计算
np.linalg(a) # 求逆
np.linalg.solve(a,y) # 求线性解,ax=y
np.linalg.eig(a) # 求特征值,特征矩阵
随机函数
np.random.random((size)) # 产生0-1随机数,形状为size
np.random.rand(d1,d2,...) # 产生0-1均匀分布随机数,形状为d1,d2...
np.random.randn(d1,d2,...) # 产生标准正态分布(均值为0,方差为1),形状为d1,d2...
np.random.normal(loc=mu, scale=sigma, size=None) # 产生正态分布(均值为mu,方差为sigma,size)
np.random.uniform(low=a, high=b, size=None) # 产生a到b的均匀分布随机数,形状为size
np.random.randint(low, high=None, size=None, dtype='l') # 产生均匀分布的整数,若只有一个参数,从0开始,不包括最大值
np.random.shuffle(a) # 打乱顺序,返回Nono,在原数据上面进行洗牌。如果a是多维数组,只对第一维,也即是列进行洗牌,
---
本文来自博客园,作者:Bingmous,转载请注明原文链接:https://www.cnblogs.com/bingmous/p/15643741.html