array,list,dataframe索引切片操作 2016年07月19日——智浪文档
list,一维,二维array,datafrme,loc、iloc、ix的简单探讨
Numpy数组的索引和切片介绍:
从最基础的list索引开始讲起,我们先上一段代码和结果:
a = [0,1,2,3,4,5,6,7,8,9]
a[:5:-1] #step < 0,所以start = 9
a[0:5:-1] #指定了start = 0
a[1::-1] #step < 0,所以stop = 0
输出:
[9, 8, 7, 6]
[]
[1, 0]
list切片,在“[]”中都有一般都有两个个“:”分隔符,中文意思是 [开始:结束:步长] 在上面的案例中,步长是-1所以输出的数据就倒序了。没有赋值(start,stop)就默认为0。sep默认为1且值不能为0。
a[10:20]#前11-20个数
a[:10:2]#前10个数,每两个取一个
a[::5]#所有数,每5个取一个
python切片中的高级操作:
切片的原理分析:
list的切片,内部是调用getitem,setitem,delitem和slice函数。而slice函数又是和range()函数相关的。
给切片传递的键是一个特殊的slice对象。该对象拥有可描述所请求切片方位的属性,切片的含义和演示:
>>> List4 = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> x = List4[1:10] #x = List4.__getitem__(slice(1,10,None))
[2, 3, 4, 5, 6, 7, 8, 9, 10]
>>> List4[1:5]=[100,111,122] #List4.setitem__(slice(1,3,None),100,111,122])
[1, 100, 111, 122, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> del List4[1:4] #List4.del__delitem__(slice(1,4,None))
[1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>>
切片的边界问题:
s=[1,2,3,4] # S 上界为 0 下界为 4
s[-100:100] #返回 [1,2,3,4] -100超出了上界,100超出了下界:等价于 s[0:4]
s[-100:-200] #返回 [] -100,-200均超出了上界,自动取上界:等价于s[0:0]
s[100:200] #返回 [] 100,200均超出了下界,自动取下界值:等价于s[4:4]
s[:100] #返回 [1,2,3,4] 开始值省略表示从第0个开始
s[0:] #返回 [1,2,3,4] 结束值为空表示到最后一个结束
切片的扩展知识:
>>> id(List4)
140115516658320
#直接通过列表来赋值 List5 = List4,指向的内存地址空间是不变的,都是(140115516658320),无论删除List4还是List5这个列表都会被删除,即List4和List5都没有元素了。
>>> List5 = List4
>>> List5
[1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> List4
[1, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
>>> id(List5)
140115516658320
#但是,通过切片来命名的两个列表他们指向的内存地址编号是不同的,140115516658320 != 140115516604784
>>> List6 = List5
>>> id(List6)
140115516658320
>>> List6 = List4[:]
>>> id(List6)
140115516604784
>>> #地址改变
...
>>>
下面们对扩展进行补充:
>>> listOfRows = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
>>> li = listOfRows
>>> id(listOfRows)
206368904L
>>> id(li) #两者id一致,引用了同一个对象
206368904L
>>> listOfRows[:] = [[row[0], row[3], row[2]] for row in listOfRows]
>>> listOfRows
[[1, 4, 3], [5, 8, 7], [9, 12, 11]]
>>> li #使用切片赋值,达到预期效果,同一对象跟随改变
[[1, 4, 3], [5, 8, 7], [9, 12, 11]]
>>> id(listOfRows)
206368904L
>>> id(li) #两者的id都没有变化,说明切片赋值实在原对象上修改
206368904L
>>> listOfRows = [[1,2,3,4], [5,6,7,8], [9,10,11,12]]
>>> li
[[1, 4, 3], [5, 8, 7], [9, 12, 11]]
>>> id(li) #li没有改变
206368904L
>>> id(listOfRows) #两者id不同,说明listOfRows绑定了一个新的对象
206412488L
>>> listOfRows
[[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]]
直接使用 "listOfRows =" 的话,产生了一个新的对象,使用"listOfRows[:] =" 写法。简单地说,使用切片赋值可以修改原对象的类容,而不是创建一个新对象。
序列(consequence)是 python 中一种数据结构,这种数据结构根据索引来获取序列中的对象。
python 中含有六种内建序列类:list, tuple, string, unicode, buffer, xrange。其中 xrange 比较特殊,它是一个生成器,其他几个类型具有的一些序列特性对它并不适合。一般说来,具有序列结构的数据类型都可以使用:index, len, max, min, in, +, *, 切片。
list切片称为步进切片,允许使用第三个元素进行切片它的语法为sequence[起始索引:结束索引:步进值]。口