NumPy笔记
最近在看《利用Python进行数据分析》这本书,也会在网上查看一些资料,所以会对某些感觉比较重要的部分进行总结,一方面加深自己对一些方法的记忆,一方面方便自己以后的大总结。
基本概念:
Numpy(Numerical Python)是高性能科学计算和数据分析的基础包
NumPy的ndarray:多维数组对象,快速灵活的大数据集容器
所有元素必须是同类型
可以查看官方文档https://docs.scipy.org/doc/numpy/reference/routines.html,也可以到http://download.csdn.net/download/nsguf/9944297进行下载。
以下源码下载:https://github.com/NSGUF/PythonLeaning
常用属性:
print(np.version.version)#numpy的版本 data1=[1,2,3,4] arr1=np.array(data1) print(arr1) data2=[[1,2,3,4],[5,6,7,8]] arr2=np.array(data2) print(arr2) print("------------属性---------------") print(arr2.ndim)#数组的维数 print(arr2.shape)#数组的维度 print(arr2.size)#数组的元素总个数 print(arr2.dtype)#数组中元素的类型 print(arr2.itemsize)#数组中每个元素的字节大小 print(arr2.data)#实际数组元素的缓冲区 #NumPy自带了很多数据类型比如int16,int32等,取值时可用np.int16 #NumPy的转换方式为 print(np.int32(12.123))
创建数组的方法:
print("------------创建数组的方法--------------") print(np.ones((2,3,4),dtype=np.int16))#全为1的多维数组 print(np.empty((2,3)))#为空的多位数组,只分配内存,不初始化,所以运行速度快 print(np.full(4,np.pi))#初始化为指定值 print(np.random.random((2,3)))#生成shape为2,3的随机数组 print(np.arange(10,30,5))#以10开始差值为5的等差数列,不包含30 print(np.linspace(10,30,4))#第一个数为10,最后一个数为30,取5个等差数 print(np.logspace(0,2,5))#等比数列,从10^0到10^2中5个数 print(np.arange(4))#相当下面的式子 print(np.arange(0,4,1)) print(np.arange(12).reshape(4,3))#更换成shape为4,3 a=np.arange(24).reshape(2,3,4) #print(a.resize(24))#resize作用与reshape相同,但是调用resize将会改变自身,reshape不会 b=np.arange(4) print(a)#shape为2,3,4,ps:总个数必须为shape的乘积,否则报错 print(a[1,...])#等同于a[1] print(a[1])#第2个整列 print(a[0,1])#取第一整列的第三列 print(a[1,1,1])#第2大列的第2行的第2列,一个元素
对数组进行操作和运算:
print("------------对数组进行操作--------------") c=a-b#加减乘除都可,将元素分别对应加减乘除,shape必须对应,除的话注意除数为0的情况 print(c) print(a**2)#会对数组每个元素进行处理,也可进行一下方法遍历 print(a.sum())#总和 print(a.min())#最小的数 print(a.max())#最大的数 print(a.cumsum())#获取每个数的前n的和,比如前1个位0,前2个位0+1,前3个位0+1+2以此类推 d=np.arange(12).reshape(3,4) print(d.sum(axis=-2))#总和 print(d.min(axis=0))#最小的数 print(d.max(axis=-1))#最大的数 print(d.mean())#算术平均数 print(d.std())#标准差 print(d.var())#方差 print(d.argmin())#最小索引 print(d.argmax())#最大索引 print(d.repeat(5))#重复 print(np.power(b,3))#b的3次方 print(np.repeat(3, 4))#创建一个一维数组,元素为3,重复4次 print(d.cumsum(axis=1))#获取每个数的前n的和,比如前1个位0,前2个位0+1,前3个位0+1+2以此类推 print(d.cumprod())#所有元素的累积积 #总结:当没有axis参数的时候,默认为全部元素,当值为0或-2时,表示每个列中的第一个数,当值为1或-1时,表示以列做运算,其他值则报错 s=np.array([4,3,1,45,2,1,23]) s.sort()#排序 print(np.unique(s))#找出唯一值并排序
布尔值数组方法:
print("------------布尔值数组方法--------------") bools=np.array([False,False,True,False]) print(bools.any())#是否存在一个或多个True print(bools.all())#全是True print(a.ravel())#将shape值设为(元素总个数),相当于a.reshape(a.size) print(a.ravel().shape) print(np.sin(a)) print(np.floor(a))#向上取整 c=a.copy()#深拷贝 print(c is a) print(a)
对数组进行遍历的方式:
print("------------对数组进行遍历--------------") for row in a:#遍历行 print(row) for element in a.flat:#遍历每个元素 print(element)
数组文件的输入输出:
print("------------数组文件输入输出--------------") np.save("save_a.npy",a)#将数组以.npy扩展名存入磁盘 np.load("save_a.npy") np.savez('array_a_b.npz',a=a,b=b)#将a和b一起存储 arch=np.load('array_a_b.npz') print(arch['b'])#获取b数组 np.savetxt("text_b.txt",b,delimiter=',')#写入txt文件,以,为分隔符 arr=np.loadtxt("text_a.txt",delimiter=',')#读取txt文件,以,为分隔符 print(arr)
对线性代数的一些方法,对矩阵的操作:
print("----------------------线性代数-------------------------") print(np.dot(a,b))#矩阵相乘 print(a.transpose())#转置 print(np.rot90(a,3))#逆时针选择90度,第二个参数是旋转次数 print(np.fliplr(a))#纵轴左右翻转 print(np.flipud(a))#纵轴上下翻转 print(np.roll(a,1,axis=1))#滚动位移 print(np.trace(a))#迹,对角线的和 e=np.array([[1,2,3],[1,2,3],[1,2,3]]) print(np.diag(e))#以一维数组的形式返回方阵的对角线元素 print(np.vstack((np.array([[1,1],[1,1]]),np.array([[1,0],[0,1]]))))#合并 print(np.hstack((np.array([[1,1],[1,1]]),np.array([[1,0],[0,1]]))))#合并后翻转,如果只有一个参数,则是把该参数的合并成一行
随机数的生成:
print("----------------------随机数生成-------------------------") print(np.random.normal(size=(4,4)))#正态分布随机数,生成4*4的数组,和python内置的random相比,np.random快了很多 print(np.random.binomial(10,0.5,100))#n=10,p=0.5的二项分布 print(np.random.shuffle(b))#对序列随机排序 print(np.random.permutation(a))#对a进行乱序并返回一个新的array print(np.random.rand(3,2))#均匀分布的样本值 print(np.random.randint(5,size=(4,3)))#第一个属性为上限表示0-5, print(np.random.randn())#正态分布(平均值为0,标准差为1)的样本值 print(np.random.beta(10,10,size=10))#beta分布
补充:reshape(-1,2)表示只知道2列,多少行系统根据元素个数自动填写,
np.random.uniform(x1,x2)表示:从x1到x2中随机采样
np.random.seed(0)表示设置种子,这句话很抽象,这么说吧,比如我希望一个随机数在全局位置上产生的数是相同的,只要在前面设置一下这段代码即可。就像我们在做别人做过的实验的时候,只要设置的种子和别人一样,产生的数据集也一样,这样可以对比自己和别人的数据结果。
文章来源:NSGUF,欢迎分享,转载请保留出处