数组的索引和切片

创建或得到一个数组后,常常需要对数组中的某个或部分元素进行处理。在处理它们之前,需要先获取它们。获取它们的过程就是索引和切片。如果获取单个元素或不连续多个元素,称为索引;如果获取连续多个元素,称为切片。数组中每个元素都有自己的位置坐标,比如一维数组中的第几个元素,或二维数组中哪一行哪一列的元素。使用坐标对元素进行定位。位置定下来后就可以找到它,获取它。[大谦MATLAB,dqmatlab点com]

单个元素的索引

MATLAB和Python中分别用小括号和中括号进行索引和切片。对单个元素进行索引,给数组指定元素的坐标值即可。一维数组有一个坐标,二维数组有两个坐标。这个坐标常被称为索引号。

【MATLAB】

先考虑一维数组的情况,创建一个一维数组A:

code.matlab
>> A=1:8
A =
	1	2	3	4	5	6	7	8

获取数组中第2个元素:

code.matlab
>> A(2)
ans =
	2

再看一下二维数组。创建一个二维数组B:

code.matlab
>> B=[12 62 93 -8 22; 16 2 87 43 91]
B =
    12    62    93    -8    22
    16     2    87    43    91
    -4    17   -72    95     6

获取第2行第3列的元素:

code.matlab
>> B(2,3)
ans =
     87

获取第1行第4列的元素:

code.matlab
>> B(1,4)
ans =
     -8

【Python】

Python中从NumPy数组中获取单个值,与MATLAB中不同之处有两点,一是MATLAB中用小括号进行索引,而Python中用中括号索引;二是索引号的基数为0,MATLAB中索引号的基数为1。

下面用arange函数创建一个一维NumPy数组。

code.python
>>> a=np.arange(8)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7])

获取数组中的第2个值。

code.python
>>> a[1]
1

设置索引号为负的整数N,可获取数组中倒数第N个值。下面获取数组a的倒数第3个元素。

code.python
>>> a[-3]
5

对于二维的情况:

code.python
>>> b=np.array([[12,62,93,-8,22],[16,2,87,43,91],[-4,17,-72,95,6]])

获取第2行第3列的元素:

code.python
>>> b[1,2]
87

获取第1行第4列的元素:

code.python
>>> b[0,3]
-8

多个不连续元素的索引

用数组给定一组索引号进行索引,可以实现一次同时索引多个不连续元素。

【MATLAB】

创建一维数组A:

code.matlab
>> A=1:8;

获取第2、5、7个元素:

code.matlab
>> A([2,5,7])
ans =
	2	5	7

创建二维数组B:

code.matlab
>> B=[12 62 93 -8 22; 16 2 87 43 91];

获取第1行第1列和第3列的元素:

code.matlab
>> B(1,[1,3])
ans =
     12	93

【Python】

创建一个一维NumPy数组。

code.python
>>> a=np.arange(8)

获取数组中的第2、5、7个值。

code.python
>>> a[[1,4,6]]
array([1, 4, 6])

对于二维的情况:

code.python
>>> b=np.array([[12,62,93,-8,22],[16,2,87,43,91],[-4,17,-72,95,6]])

获取第1行第1列和第3列的元素:

code.python
>>> b[0,[0,2]]
array([12, 93])

数组的切片

通过切片可以获取数组中的连续多个元素。切片需要指定连续多个元素的起始索引号、终止索引号和递增步长。默认时步长为1,可以省略不写。

【MATLAB】

创建一维数组A:

code.matlab
>> A=1:8;

获取第2至7个元素:

code.matlab
>> A(2:7)
ans =
	2	3	4	5	6	7

第2至7个元素中,每隔2个元素获取1次。此时在索引号2和7之间添加步长2。

code.matlab
>> A(2:2:7)
ans =
	2	4	6

获取第4个元素及它之后的所有元素。用end表示数组当前维的最后一个元素的索引号。

code.matlab
>> A(4:end)
ans =
	4	5	6	7	8

对于二维的情况,创建二维数组B:

code.matlab
>> B=[12 62 93 -8 22; 16 2 87 43 91];

获取第1行第1列到第3列的元素:

code.matlab
>> B(1,1:3)
ans =
     12	62	93

获取行号第1行到第2行,列号第2列到第3列构成的局部区域内的元素:

code.matlab
>> B(1:2,2:3)
ans =
     62	93
	2	87

【Python】

下面用arange方法创建一个NumPy数组。

code.python
>>> a=np.arange(8)
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7])

获取数组中第2-7个元素。注意Python中切片时遵循包头不包尾原则,即下面代码中索引号7对应的第8个元素不包括进来。

code.python
>>> a[1:7]
array([1, 2, 3, 4, 5, 6])

第2至7个元素中,每隔2个元素获取1次。此时在索引号1和7之后添加步长2。注意,MATLAB中步长是添加在起始值和终止值之间,Python中步长则是添加在终止值之后。

code.python
>>> a[1:7:2]
array([1, 3, 5])

获取数组中第4个及后面所有的值。注意Python中冒号的用法,冒号在前面,表示前面的值全取;冒号在后面,表示后面的值全取;冒号在两个数之间,表示取这两个数确定的范围内的所有值。

code.python
>>> a[3:]
array([3, 4, 5, 6, 7])

获取数组中前5个数据。

code.python
>>> a[:5]
array([0, 1, 2, 3, 4])

获取数组中倒数第3个及它后面所有的值。

code.python
>>> a[-3:]
array([5, 6, 7])

对于二维的情况:

code.python
>>> b=np.array([[12,62,93,-8,22],[16,2,87,43,91],[-4,17,-72,95,6]])

获取第1行第1列到第3列的元素:

code.python
>>> b[0,0:3]
array([12, 62, 93])

获取行号第1行到第2行,列号第2列到第3列构成的局部区域内的元素:

code.python
>>> b[0:2,1:3]
array([[62, 93],
       [ 2, 87]])