最近在学习数据分析,到了numpy的学习阶段,边学边整理分享自己的学习笔记,希望能对你也有所帮助!
这次的学习笔记包括以下内容:
1.数组的创建方式
2.多维数组的简单操作
3.数组的索引和切片操作
4.布尔索引
5.数组值的替换操作
6.数组的形状操作
7.数组的叠加
8.数组的切割
9.数组的转置
10.浅拷贝和深拷贝
11.文件操作的几种方式
正式进入主题之前,默认numpy的导入如下:
import numpy as np
一、数组的创建方式
数组的创建常用的有四种方式:
1.利用array创建基本数组,如果已经有了基本的数组,或者数据比较简单时,可以通过这种方式创建,示例如下:
import numpy as np
a1 =np.array([1,2,3])
2.如果需要创建连续的数组,类似等差数列,可以通过arange函数,示例如下:
import numpy as np
a1 =np.arange(10) #创建0-9的数组
3.如果需要创建随机数组,这也是经常用到的一种方式,需要用到numpy中的random随机函数,类似python中的随机函数,示例如下:
import numpy as np
a1 =np.random.randint(0,10,size=(3,4)) #创建3行4列的的数组,数组元素0-9
4.特殊数组。
4.1全部是0的数组
import numpy as np
a1 =np.zeros((4,3)) #创建元素全部是0的4行3列的数组
4.2全部是1的数组
与上面的方法类似,代码如下:
import numpy as np
a1 =np.ones((4,3)) #创建元素全部是0的4行3列的数组
4.3 创建全部是某个指定元素的数组
import numpy as np
a1 =np.full((4,3),9) #创建全部是9的4行3列的数组
4.4创建对接线上全部是1,其他位置都是0的数组
import numpy as np
a1 =np.eye((3)) #注意只能传入1个元素,生成N行N列的数组
二、多维数组的简单运算
2.1 ndim 判断是几维数组
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1.ndim) #结果打印为2,二维数组
2.2 .size获取元素总的个数
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1.size)
输出结果12,共有12个元素
2.3 .shape判断数组的形状
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1.shape)
生成结果返回一个元组(4,3)
2.4 reshape() 改变数组的形状
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1)
a2=a1.reshape((2,6)) #由4行3列改为2行6列
print(a2)
2.5 flatten 转换为一维数组
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
a2 =a1.flatten() #将a1转换为1维数组
三、数组的切片和索引操作
numpy中数组的切片和索引操作,与python中的操作类似
3.1一维数组,与列表操作是一致的,比如从10个元素的数组中操作:
a1 =np.arange(10)
print(a1[0:5]) #取出前5个元素
print(a1[1]) #取出第2个元素
print(a1[-1]) #取出最后一个元素
3.2二维数组操作
切片时[]中行列数据分别表示,中间用逗号分隔
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1[1,2]) #取出2行3列的元素
print(a1[1]) #取出第2行
print(a1[:,[1]]) #取出第2行
print(a1[[0,2]]) #间隔取出第1,3行
print(a1[[0,2],[1,2]]) #获取1行2列,3行3列的元素
四、布尔索引
对于某些需要判断的情况,可以把数组当做切片的参数,用布尔索引往往会事半功倍,比如
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1>3)
上面的代码,可以生成一个布尔矩阵结果如下:
[[ True True True]
[False True True]
[ True False True]
[ True False True]]
意为满足条件的值为True
4.1 单条件筛选 当我们需要将数组中满足某个条件的元素同时取出时,可以直接在数组取值中用于判断,示例如下:
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1)
print(a1[a1>3])
结果如下:
[[6 2 4]
[2 1 7]
[4 2 6]
[1 6 2]]
[6 4 7 4 6 6]
4.2 多条件筛选
当需要多个条件筛选时,可以用 | 表示or ,用&表示 or,示例如下:
import numpy as np
a1 =np.random.randint(1,9,size=(4,3))
print(a1)
print(a1[(a1<7) | (a1>3)]) #输出同时满足 大约7和 大于3的元素,注意条件用()
五、数组值的替换
5.1类似列表中的数值替换
import numpy as np
a1 =np.arange(12).reshape(3,4) #生成3行4列的二维数组
a1[0,0] =10 #将第一个元素替换为10
5.2 条件替换
import numpy as np
a1 =np.arange(12).reshape(3,4) #生成3行4列的二维数组
a1[a1>5] =10 #将所有大于5的元素替换为10
六、数组的形状操作
包括reshape,resize ,flatten 和vavel四个操作
6.1 reshape和resize属于改变形状的操作,区别在于采用reshape之后,会生成新的数组,原数组的形状不发生变化,示例如下:
import numpy as np
a1 =np.arange(12).reshape(3,4) #生成3行4列的二维数组
print(a1)
a2 =a1.reshape(2,6)
print(a2)
print(a1)
如果采用resize方法,不存在返回值,故会发生变化
import numpy as np
a1 =np.arange(12).reshape(3,4) #生成3行4列的二维数组
print(a1)
a1.resize(2,6)
print(a1)
6.2 转换为一维数组
将数组转换为一维数组,可以采用flatten和ravel()两个函数,方法是一样的,结果也都不会改变原来数组的形状,但区别在于前者如果修改数组中的元素,不会改变原数组,但后者如果修改,会对原数组的数值造成改变,示例如下:
import numpy as np
a1 =np.arange(12).reshape(3,4) #生成3行4列的二维数组
print(a1)
a2=a1.ravel()
a3 =a1.flatten()
print(a2)
print(a3)
七、数组的叠加
当两个数组需要组合的时候,需要考虑他们的结构,需要在叠加的方向上结构保持一致,比如3行5列的数组,和3行4列的数组,如果水平方向叠加是可以的,但如果垂直方向叠加则无法实现,比如下图的实例,自己体会下
能用到的函数有3个,
vstack:垂直方向叠加,上下方向
hstack:水平方向叠加 ,左右方向
concatenate: 两个方向都可以,需要指定轴
具体示例如下:
import numpy as np
a1 =np.random.randint(0,9,size=(4,3)) #4行3列
a2 =np.random.randint(0,9,size=(4,2)) #4行2列
a3 =np.hstack([a1,a2]) #水平方向,左右叠加
import numpy as np
a1 =np.random.randint(0,9,size=(4,3)) #4行3列
a2 =np.random.randint(0,9,size=(2,3)) #2行3列
a3 =np.vstack([a1,a2]) #垂直方向,上下叠加
import numpy as np
a1 =np.random.randint(0,9,size=(4,3)) #4行3列
a2 =np.random.randint(0,9,size=(2,3)) #2行3列
a3 =np.concatenate([a1,a2],axis=0) #axis=0等同于vstack,axis=1 等同于hstack
八、数组的分割
当需要把一个数组进行拆分时,用到的函数同样有3个:
vsplit:水平方向分割
hslpit:垂直方向分割
split:需要选择分割的轴
与叠加的方法类似,区别在于,如果只指定一个变量,相当于平均分割,需要计算是否可以等分,当然也可以不平均分割,指定好分割的方向和分割的点即可!示例如下:
import numpy as np
a1 =np.random.randint(0,9,size=(6,3)) #6行3列
a2 =np.vsplit(a1,3) #水平方向,平均分成3组,相当于每2行1组
a3 =np.vsplit(a1,(1,3)) #水平方向,相当于第1行和第3行分隔,1行一组,2-3行一组,剩下的1组
a4 =np.hsplit(a1,3) #垂直方向,平均分成3组,相当于每1列1组
九、数组的转置
当我们需要把一个数组的行列互换时,比如3行5列,换成5行3列的时候,就会用到数组的转置,这里用到2个方法
.T:数组转置,修改数值不影响原数组的数值
.transpose():数组转置,修改数值会影响原有的数值
示例如下:
import numpy as np
a1 =np.random.randint(0,9,size=(6,3)) #6行3列
a2 =a1.transpose() #转置变为3行6列
a3 =a1.T #转置变为3行6列
十、浅拷贝(view)和深拷贝(copy)的区别
numpy的数组复制中,存在2种拷贝的方式,一种是浅拷贝,类似复制了一个view,类似window中的快捷方式,也就意味着,虽然是拷贝,但如果你修改拷贝之后的数组,原数组仍然是要变化的;
第二种拷贝是深拷贝,区别于浅拷贝,自然是新的数组修改不会影响原来的数组,实例如下:
import numpy as np
a1 =np.random.randint(0,9,size=(6,3)) #6行3列
a2 =a1.view() #浅拷贝
print(a1)
a2[0,0] =1000 #修改a2中的数据,a1也会修改
print(a1)
import numpy as np
a1 =np.random.randint(0,9,size=(6,3)) #6行3列
a2 =a1.copy() #深拷贝
print(a1)
a2[0,0] =1000 #修改a2中的数据,a1不会修改
print(a1)
十一、文件操作
对于数据处理而言,经常会用到对文件的相关操作,其中使用最多的大概就是csv文件,关于csv文件的操作分为保存和读取两部分,具体如下:
10.1文件的保存
np.savetxt(“文件名”,数组,delimiter=’, ‘,header,comment =’’,fmt ="%d"))
文件名:要保存的文件名
数组:数组变量
delimiter= :指定数据的分隔符,csv文件保存习惯用逗号
header:可以根据情况添加表头,注意用上面提到的分隔符进行分隔
fmt:要保存的数据结构,比如fmt="%d"
10.2文件的读取
同保存类似,方法如下:
np.loadtxt(文件名,数组,分隔符,跳过的内容skiprows)
区别在于,如果希望表头是汉字,而不是数据,是无法读取的,需要跳过前面的几行,用到skiprows参数,根据需要设置即可
10.3numpy独有的数据存储方式
np.save(文件名) —后缀名.npy,可以不加后缀名
np.savez(文件名) —压缩文件
np.load(文件名) —读取文件
限制:不可以存取不同的数组类型,比如浮点和数字不能同时存储,另外,excel是打不开的,也算是安全性相对较高
优点:可以存取多维数组,比如三维数组以上的,而这些是excel无法存储的
今日总结如上,供大家参考!码字不易,如果你读到了这里,可以给个赞了!-