基本的索引和切片
数组切片是原始数组的视图,这意味着数组不会被复制,视图上的任何修改都会直接反映到源数据。
In [1]: arr = np.arange(10)
arr[5:8] = 12
arr #arr[5:8]的值不是5,6,7了,而是修改后的12
Out[1]: array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
继续,将切片赋值给一个变量,对该变量进行操作,看看源数据如何变化。
In [2]: arr_slice = arr[5:8]
arr_slice[1] = 123
arr
Out[2]: array([ 0, 1, 2, 3, 4, 12, 123, 12, 8, 9])
很明显,结果如我们所料,源数据随切片变化而变化,所以:如果想要得到的是ndarray切片的一份副本而不是视图,就需要显式地进行复制操作,例如arr[5:8].copy()。
Numpy数组中的元素索引
对于一个二维数组,各索引位置上的元素不是标量而是一维数组,而三维数组呢,以此类推啦..
In [3]: arr2d = np.array([[1,2,3], [4,5,6], [7,8,9]])
arr2d[2]
Out[3]: array([7, 8, 9])
获取单个元素,比如3,可以为arr2d[0][2],这样有点麻烦对吧,可以传入一个以逗号隔开的索引列表来选取单个元素。即:
arr2d[0,2],这两种方式是等价的。
对于三维数组,arr3d[0]是一个2 x 3数组:
In [4]: arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d
Out[4]: array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
In [5]: arr3d[0]
Out[5]: array([[1, 2, 3],
[4, 5, 6]])
网友评论