索引和切片

Posted 薛乔毓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了索引和切片相关的知识,希望对你有一定的参考价值。

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]])

 

以上是关于索引和切片的主要内容,如果未能解决你的问题,请参考以下文章

精密解析Python切片的用法

使用ffmpeg视频切片并加密

Python切片中的误区与高级用法

python——入门系列索引与切片

NumPy索引切片

你知道的Go切片扩容机制可能是错的