本文主要列出np常用的数组函数与方法。
文中前标#的代码表示其不同参数下执行情况。
文中后标#的代码为错误代码。
目录
ndarray数组的创建
# 一维数组
import numpy as np
# 内部元素同类型
arr = np.array([1,2,3,4,5,6])
print(arr)
arr = np.array([1,2,3.,4,5,6])
print(arr)
# 多维数组
# 参数ndmin 维度
arr = np.array([[1,2,3][4,5,6]])
# arr = np.array([1,2,3,4,5,6],ndmin=2)
# arr = np.array([1,2,3,4,5],dtype=np.float32,ndmin=2)
print(arr)
# 结构化数据
student = np.dtype([('name','S20'),('age','i4')])
arr = np.array([('shi',18),('jiang',20)],dtype=student)
print(arr)
arr = np.asarray([1,2,3,4,5])
# arr = np.asarray((1,2,3,4,5))
print(arr)
arr = np.asarray([(1,2,3),(4,5)])
# arr = np.asarray([(1,2,3),(4,5)],dtype=object)
print(arr)
# empty() 创建数组,结果在未初始化时为任意值
arr = np.e,pty([3,2],dtype=int)
print(arr)
# zeros() 创建数组,结果在未初始化时为0
# zeros创建数组与empty相同,数组每个元素值为0
arr = np.zeros([3,2])
print(arr)
# ones() 创建数组,结果在未初始化时为0
arr = np.ones([3,2])
print(arr)
# full() 创建数组,使用参数fill_value指定填充
arr = np.full([3,2],fill_value=8,dtype='f')
print(arr)
# eye() 创造单位矩阵
arr = np.eye(5,dtype='i4')
print(arr)
# arange() 创造一维数组,参数与range() 相同
arr = np.arange(1,11,2)
print(arr)
# formbuffer(buffer, dtype=ofter,count=-1,offset=0)
# buffer 任何对象,以流的方式读入
arr = np.frombuffer(b'jianghua')
# arr = np.frombuffer(b'jianghua',dtype='S1')
# arr = np.frombuffer(b'jianghua',dtype='S1',count=5,offset=2)
print(arr)
# fromiter(iterable,dtype,count=-1) # iterable 为可迭代对象
arr = np.fromiter(iter([1,2,3,4,5]),dtype='f')
print(arr)
# linspace(start,stop,num=50,endpoint=True,retstep=False,dtype=None)
# 创造等差数列
arr = np.linspace(1,10,10,dtype='f')
# arr = np.linspace(1,11,11,dtype='i4')
# arr = np.linspace(1,11,11,endpoint=False,dtype='i4')
# arr = np.linspace(1,10,10,endpoint=False,retstep=True,dtype='i4')
print(arr)
# logspace(start,stop,num=50,endpoint=True,basr=10.0,dtype=None)
# 创造等比数列
arr = np.logspace(1,10,10,dtype='f')
print(arr)
# 生成 0 - 1 之间的随机数(生成方式左闭右开)
arr = np.random.rand(1)
# arr = np.random.rand(3)
# arr = np.random.rand(3,3)
# arr = np.random.rand(3,3,3)
print(arr)
# 生成 0 - 1 之间的随机数
arr = np.random.random(3)
# arr = np.random.random(3,3) # 报错
print(arr)
# 随机生成整数
arr = np.random.randit(0,10,5)
print(arr)
# 生成一个或一组 u 分布样本
arr = np.random.randn()
# arr = np.random.randn(5)
# arr = np.random.randn(5,5)
# arr = np.random.randn(5,5,5)
print(arr)
# 生成高斯分布概率密度随机数
# random.normal(loc=0.0,scale=1.0,size=None)
# loc分布均值 scale分布标准差 size输出的shape
arr = np.random.normal(loc=1,scale=2,size=5)
print(arr)
ndarry数组属性
一个维数组就是numpy的轴(axis),轴的数量(维度)叫做秩(rank)
axis = 0 列操作 axis = 1 行操作
# ndim 维度
import numpy as np
arr = np.array([1,2,3,4,5])
# arr = np.array([[1,2,3],[4,5]])
print(arr)
print(arr.ndim)
# shape 数组维度
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print(arr.shape)
arr.shape = (3,2)
print(arr)
print(arr.shape)
# size 数组元素个数
arr = np.arange(9).reshape(3,3)
print(arr)
print(arr.size)
# dtype 数组元素类型
arr = np.arange(9).reshape(3,3)
print(arr.dtype)
# itemsize 数组元素类型字节数
arr = np.array([[1,2,3],[4,5,6]])
# arr = np.array([[1,2,3],[4,5,6]],dtype='i1')
# arr = np.array([[1,2,3],[4,5,6]],dtype='f')
print(arr.itemsize)
# flags
arr = np.arange(9).reshape(3,3)
print(arr.flags)
切片和索引
arr = np.arange(9)
arr1 = slice(1,5,2)
print(arr[arr1])
print(arr[3])
arr = np.arange(9).reshape(3,3)
print(arr[1][2])
# ... 代表所有
print(arr)
print(arr[...,1])
print(arr[1,...])
# 高级索引
# 取特定行列元素
arr = np.arange(9).reshape(3,3)
print(arr[[0,1,2],[0,1,2]])
print(arr)
rows = np.array([[0,0],[2,2]])
cols = np.array([[0,2],[0,2]])
print(arr[rows,cols])
print(arr)
print(arr[arr>3])
arr = np.array([np.nan,1,2,3,4,np.nan])
print(arr)
print(arr[np.isnan(arr)])
print(arr[~np.isnan(arr)])
广播
# 对不同形状数组进行计算时,算数运算通常在相应元素上进行
# 形状相同
arr1 = np.arange(9)
arr2 = np.arange(9,18)
print(arr1+arr2)
# 形状不同 小扩展到大
arr = np.arange(9).reshape(3,3)
arr1 = np.arrange(3)
print(arr,arr1)
print(arr.shaep,arr1.shaep)
print(arr.nidm,arr1.ndim)
print(arr+arr1)
arr1 = np.tile(arr1,(3,1))
print(arr1)
print(arr+arr1)
arr1 = np.arange(9)
arr1.shape=(3,3)
arr2 = np.arange(5,10)
# print(arr1,arr2) #会报错
迭代
# nditer 用作数组迭代 每个元素都可以使用标准Iterator接口访问
arr = arange(9).reshape(3,3)
for x in np.nditer(arr):
print(x,end=' ')
# 因为数组和其转置在内存中存储顺序相同
# 所以迭代在数组和其转置是相同的
print (arr)
for x in np.nditer(arr):
print(x,end=' ')
for x in np.nditer(arr.T):
print(x,end=' ')
# T.copy() 存储顺序不同,迭代后也不同
print(arr)
arr1 = arr.T.copy(order='C')
print(arr1)
for x in np.nditer(arr1):
print(x,end=' ')
# 控制遍历顺序
# order='C' 行遍历 'F' 列遍历
arr = np.arange(9).reshape(3,3)
arr1 = arr.T.copy(order='F')
for x in np.nditer(arr):
print(x,end=' ')
for x in np.nditer(arr1(order='F')):
print(x,end=' ')
# op_flags = ['remdwrite'] 遍历时可改变元素
print(arr)
for x in np.nditer(arr.T,order='F',op_flags=['readwritr']):
x[...] = x*2
print(arr,end=' ')
# 外部循环
# [external_loop] 遍历后得到数组
arr = np.arange(9).reshape(3,3)
print(arr)
for x in np.nditer(arr,flags=['external_loop']):
# for x in np.nditer(arr,order='F',flags=['external_loop']):
print(x,end=' ')
# 广播迭代
arr1 = np.arange(9).reshape(3,3)
arr2 = np.arange(3)
# arr2 = np.arange(4)
for a,b in np.nditer([arr1,arr2]):
print('%d,%d'%(a,b),end=' ')
# print((a,b),end=' ')
修改数组
arr = anarage(9).reshape(3,3)
arr1 = arr.flatten()
# arr1 = arr.flatten(order='F')
print(arr1)
# ravel 展平数组,返回视图,C修改原数组,F不修改原数组
arr1 = arr.ravel(order='C')
arr2 = arr.ravel(order='F')
print(arr)
print(arr1)
print(arr2)
arr1[0]=10
arr2[3]=30
print(arr)
print(arr1)
print(arr2)
# 反转数组
arr = arange(9).reshape(3,3)
arr1 = arr.T
# arr1 = np.transpose(arr)
print(arr1)
# rollaxis() 不好描述,直接看代码
arr1 = np.rollaxis(arr,1)
print(arr1)
arr = anarge(27).reshape(3,3,3)
arr1 = np.rollaxis(arr,1)
print(arr1)
arr2 = np.rollaxis(arr,2)
print(arr2)
arr3 = np.rollaxis(arr,2,start=1)
print(arr3)
# swapaxes() 交换俩轴
arr = arange(9).reshape(3,3)
arr1 = np.swapaxes(arr,0,1)
print(arr1)
# 修改数组维度
# broadcast()
arr1 = np.array([[1],[2],[3]])
arr2 = np.array([1,2,3])
arr = np.broadcast(arr1,arr2)
print(arr.shape)
print(arr)
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1]))
print(next(arr.iters[0]),next(arr.iters[1])) # 迭代结束
# print(next(arr.iters[0]),next(arr.iters[1])) # 报错
arr1 = np.array([[1],[2],[3]])
print(arr1)
arr2 = np.array([1,2,3])
print(arr2)
arr = np.broadcast(arr1,arr2)
print(arr.shape)
# arr = np.empty(arr.shape)
# print(arr)
print(arr1+arr2)
# broadcast_to() 将数组广播到新形状
arr1 = np.broadcast_to(arr1,(3,3))
arr2 = np.broadcast_to(arr2,(3,3))
print(arr1)
print(arr2)
# expand_dims() 指定位置插入轴
arr = np.arange(9).reshape(3,3)
print(arr.shape)
print(arr.ndim)
arr1 = np.expand_dims(arr,axis=0)
# arr1 = np.expand_dims(arr,axis=1)
# arr1 = np.expand_dims(arr,axis=2)
print(arr1)
print(arr1.shape,arr1.ndim)
# squeeze() 删除 axis=1 的维度
arr1 = np.expand_dims(arr1,axis=0)
print(arr1)
print(arr1.shape,arr1.ndim)
arr2 = np.squeeze(arr1)
print(arr2)
print(arr2.shape,arr2.ndim)
# concatenate() 连接数组
arr1 = anarge(9).reshape(3,3)
arr2 = anarge(9,18).reshape(3,3)
#arr = np.concatenate((arr1,arr2),axis=1)
arr = np.concatenate((arr1,arr2),1)
print(arr,arr.shape,arr.ndim)
# stack()堆叠数组 参数与concarenate()相同
arr = np.stack((arr1,arr2))
print(arr,arr.shape,arr.ndim)
# hstack 水平堆叠,形成一个数组
arr = np.hstack((arr1,arr2))
print(arr,arr.shape,arr.ndim)
# vstack 垂直堆叠,形成一个数组
arr = np.vstack((arr1,arr2))
print(arr,arr.shape,arr.ndim)
分隔数组
# split() 返回list
arr = np.arange(9).reshape(3,3)
arr1 = np.split(arr,3)
# arr1 = np.split(arr,4) # 报错
print(arr1)
# arr1 = np.array(arr1)
# print(arr1.shape)
# print(arr1)
arr1 = np.split(arr,[1,2],0)
arr2 = np.split(arr,[1,2],1)
print(arr1)
print(arr2)
# vsplit 水平切割(axis=0)
arr1 = np.vsplit(arr,3)
print(arr1)
# hsplit 竖直切割(axis=1)
arr2 = np.hsplit(arr,3)
print(arr2)
数组元素的添加删除
# resize()
arr = anarge(9).shape(3,3)
arr1 = np.resize(arr,(1,3))
print(arr1)
arr2 = np.resize(arr1,(3,4))
print(arr2)
# append()
print(arr)
arr1 = np.append(arr,[9,10,11])
# arr1 = np.append(arr,[[9,10,11]],0)
# arr1 = np.append(arr,[[9],[10],[11]],1)
print(arr1)
# insert()
print(arr)
arr1 = np.insert(arr,3,9)
# arr1 = np.insert(arr,3,9,0)
# arr1 = np.insert(arr,3,[9,10,11],0)
# arr1 = np.insert(arr,3,[9],1)
# arr1 = np.insert(arr,3,[9,10,11],1)
print(arr1)
# delete()
print(arr)
arr1 = np.delete(arr,3)
# arr1 = np.delete(arr,2,0)
# arr1 = np.delete(arr,2,1)
print(arr1)
# unique() 删除重复元素 参数可一起使用
arr = np.arange(9,18).reshape(3,3)
arr1 = np.resize(arr,(5,5))
arr2 = np.unique(arr1)
# arr2 = np.unique(arr1,return_index=True)# 剩余元素的下标
# arr2 = np.unique(arr1,return_inverse=True)# 剩余元素在原数组中下标
# arr2 = np.unique(arr1,return_counts=True)# 剩余元素在原有个数
print(arr2)
书写匆忙,难免有错,如有发现,万望告知。