众所周知,python中有很多的库,numpy就是其中的一个库,做数据分析必备的库之一,
今天就让我们来学一下,numpy的切片
今天上课学这个切片切的我快自卑了,为啥为啥,脑子里全是为啥,为啥不是我想要的结果呢?后来花了半小时弄懂终于弄懂了,年轻人还是需要一些锲而不舍的精神的
首先让我们定义一个多维数组
方法一:
1:导入numpy
import numpy as np
2:定义一个数组(我发现用Spyder还是挺好用的,可以看到数据,不用输出)
D=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
数组是这样的:(索引值从0开始索引)
切片开始,准备好了吗?
1:先让我们来切出第一行
切片原理:切片多维数组就是前面表示行,后面表示列,用中括号括起来(这个不多说,下面的代码解释)
A=D[1]
#这两条代码都能得到数组的第一行
A1=D[1,:]
2:切出第一列(若只有一维数据,则在Spyder里会以列的形式排列)
B=D[:,1]
B1=D[1,2]
B2=D[:,[1,3]]
5:访问第1,3行数据
B3=D[[1,3],:]
6:取D中满足第0列大于5的所有列数据(:表示所有的行或是是列)
C=D[D[:,0]]
7:取D中满足第0中大于5的第2,3列数据
按逻辑我们应该是这样写的:
C1=D[D[:,0]>5,[2,3]]
看看上面的数据,你发现了什么?他只取了两个数,是他出错了吗?我们需要的是两列呀,为什么会这样呢?
原因:在numpy中设置行与列同时都是有条件限制,且都为多个限制用【】隔开时,只取行列一一对应的值。
上面的数相当于:
C1=D[[2,3],[2,3]]
python中数组切片默认取值,第二行第二列下的元素与第三行第三列下的元素
那么如果我们想要取出:D中满足第0中大于5的第2,3列数据,怎么取呢?
C2=D[D[:,0]>5,2:4]
总结点:
1:在numpy中,【】表示一个限制符号,前后需要一一位置对应取值,若想去规定行列的全部元素而不是单个元素来取值则需要将行列数值范围限制放在同一个【】中
2:行列规范范围,取左不取右,C2=D[D[:,0]>5,2:4]中列限制范围2:4,只取到了2,3列第四列没取
8:取D中满足第0列大于5的第1,2列数据
C3=D[D[:,0]>5,1:3]
9:加入逻辑运算,计算出#取D中第0,3行的所有列数据,本质上行及控制为逻辑列表,去逻辑值为真
TF=[True,False,True,False]
D1=D[TF,:]
#取出第0,3行的2,3列的元素
Dt4=[D[TF,2:4]]
10:取出D中大于4的数据
Dt5=D[D>4]
总结:当数据没有特殊行或者列的规定时,取出来的值为行列平行,就为一列
11:取中间几个元素,6,7,10,11(可以直接取值)
可以借助切片 : 或 … 与索引数组组合。
middle=D[1:3,1:3]
方法二:
要是一开始就先看了这方法,那我也不至于想了那么久还是没想明白,推荐一直使用这个方法,因为这个方法不仅好用,而且符合我们大脑的逻辑。
1:首先还是需要导入包:
import numpy as np
2:定义数组
D=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
3:取第1,2行,1,3列
D3=D[np.ix_([1,2],[1,3])]
4:取0,1行,1,3列
D4=D[np.ix_(np.arange(2),[1,3])]
5:取第一列小于11,列数为1,2行的所有元素
D6=D[np.ix_(D[:,1]<11,[1,2])]
6:取第一列小于11,列数为2行的所有元素
D7=D[np.ix_(D[:,1]<11,[2])]
8:取TF逻辑列表中的第二列
TF=[True,False,False,True]
D8=D[np.ix_(TF,[2])]
9:取TF逻辑列表中的,1,3列
D9=D[np.ix_(TF,[1,3])]
总结:
1:在没用.ix_(),取值的时候需要考虑取左不去右,用了之后【【1:3】,【1:4】】所涉及的列全取。而没用的时候只取1,2行,1,2,3列。
2:ix_():设置行列范围不在是去一一对应的值,而是行列所涉及的所有值
希望这篇文章对你有用,有问题评论区见。
生活明朗,万物可爱!!!!