索引和切片
Numpy数组的索引是一个内容丰富的主题,因为选取数据子集或单个元素的方式有很多。一维数组很简单,跟Python列表的功能差不多
1 In [1]: import numpy as np 2 3 In [2]: arr = np.arange(10) 4 5 In [3]: arr 6 Out[3]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) 7 8 In [4]: arr[5:8] 9 Out[4]: array([5, 6, 7]) 10 11 In [5]: arr[5:8] = 12 12 13 In [6]: arr 14 Out[6]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
如上所示,当讲一个标量值赋值给一个切片时,该值会自动传播到整个选区,与列表最重要的区别在于,数组切片是原始数组的视图。数据不会被复制,视图上的任何修改都会直接反应到原数组上(如果需要得到一份副本而非视图,就需要显示的进行复制操作,例如arr[5:8].copy())
对于高纬度数组,能做的事情更多。在一个二维数组中,各索引位置上的元素不在是标量而是一维数组。
1 In [7]: arr2 = np.array([[1,2,3],[4,5,6],[7,8,9]]) 2 3 In [8]: arr2[1] 4 Out[8]: array([4, 5, 6])
也可以对各个元素进行递归访问,传入一个以逗号隔开的索引列表来选取单个元素。以下两种方式是等价的。
1 In [9]: arr2[1][2] 2 Out[9]: 6 3 4 In [10]: arr2[1,2] 5 Out[10]: 6
在多维数组中,如果省略了后面的索引,则返回的对象会是一个维度第一点的ndarray。
1 In [12]: arr3 = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) 2 3 In [13]: arr3 4 Out[13]: 5 array([[[ 1, 2, 3], 6 [ 4, 5, 6]], 7 8 [[ 7, 8, 9], 9 [10, 11, 12]]])
arr3是一个2*3的数组
1 In [14]: arr3[0] 2 Out[14]: 3 array([[1, 2, 3], 4 [4, 5, 6]])