0. 回顾:
之前我们学习了数组创建和数组运算,这一节我们将学习数组对象的操作方法,如索引、切片和迭代等。
1. 索引、切片和迭代方法
1.1 索引机制
此次索引跟Python一致,用[ ]进行引用,第一个数从0开始计算,最后一位为-1,当需要引用多个时,用[ ]来整体引用。
示例1:
import numpy as np
a = np.arange(0, 10)
print(a, a[0], a[-1], a[[2, 3, 4]])
运行结果为:
[0 1 2 3 4 5 6 7 8 9] 0 9 [2 3 4]
当为多维数组时,需要N个正整数进行引用,如二维的用[1, 2]。
示例2:
import numpy as np
c = np.arange(0, 8).reshape(2, 2, 2)
print(c, c[0, 1, 1])
结果为:
[[[0 1]
[2 3]]
[[4 5]
[6 7]]] 3
此时,我们创建了一个三维的数组,第一维有两个元素,第二维有两个元素,第三维有两个元素。此时索引3即为【0, 1,1】。
1.2 切片操作
对于切片,使用:进行,跟Python一致,而第三个数字为间隔大小。如省去第一个数,则从第一个元素开始,省去第二个数则到最后一个元素,省去第三个数则是默认为1。
示例3:
import numpy as np
b = np.arange(0, 8)
print(b)
print(b[1:3])
print(b[::2])
print(b[:5:2])
print(b[:5:])
运行结果为:
[0 1 2 3 4 5 6 7]
[1 2]
[0 2 4 6]
[0 2 4]
[0 1 2 3 4]
对于多维数组的切片跟索引是类似的,有几个维度,则需要用逗号分为几个部分。
示例4:
import numpy as np
c = np.arange(0, 8).reshape(2, 2, 2)
print('c:', c)
print('c1:', c[0, :, :])
print('c2:', c[:, :, 0])
运行结果为:
c: [[[0 1]
[2 3]]
[[4 5]
[6 7]]]
c1: [[0 1]
[2 3]]
c2: [[0 2]
[4 6]]
值得注意的是:c2的结果不是[0,2,4,6]的原因是,此时是按二维矩阵为最小的计算单元进行的,故为第一个矩阵的第一行的第一个元素和第二行的第二个元素组成的[0,2]和[4,6]。
1.3 数组迭代
使用for进行数组的迭代。
示例5:
import numpy as np
b = np.arange(0, 8)
for i in b:
print(i)
c = np.arange(0, 8).reshape([2, 2, 2])
for j in c:
print(j)
运行结果为:
0
1
2
3
4
5
6
7
[[0 1]
[2 3]]
[[4 5]
[6 7]]
可以看到,此时用for展开都是沿着第一个维度进行的,当然还可以展开所有元素,利用flat进行。
示例6:
import numpy as np
c = np.arange(0, 8).reshape([2, 2, 2])
for j in c.flat:
print(j)
运行结果为:
0
1
2
3
4
5
6
7
示例7:利用各种聚合函数进行计算。
import numpy as np
c = np.arange(0, 8).reshape([2, 2, 2])
print(c)
print(np.sum(c, axis=0))
print(np.sum(c, axis=1))
print(np.sum(c, axis=2))
运行结果为:
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
[[ 4 6]
[ 8 10]]
[[ 2 4]
[10 12]]
[[ 1 5]
[ 9 13]]
以axis=0为例,此时是以第一个维度进行求和计算,第一个维度有两个元素,即为[[0 1],[2 3]]和[[4 5],[6 7]]],进行求和即为:0+4=4,1+5=6,2+6=8,3+7=10,以矩阵为单位即为[[ 4 6],[ 8 10]]。
2. 条件和布尔数组
利用条件表达式和布尔运算符进行索引。
示例8:
import numpy as np
d = np.arange(0, 8).reshape([2, 4])
print(d)
print(d < 5)
print(d[d < 5])
运行结果为:
[[0 1 2 3]
[4 5 6 7]]
[[ True True True True]
[ True False False False]]
[0 1 2 3 4]
3. 形状改变
我们之前已经使用reshape()函数进行矩阵形状的改变,这个使用方法是创建一个新的矩阵,如果想在原矩阵上改变,则需要改变其属性就行。
示例9:
import numpy as np
d = np.arange(0, 8).reshape([2, 4])
print(d)
d.shape = [4, 2]
print(d)
运行结果为:
[[0 1 2 3]
[4 5 6 7]]
[[0 1]
[2 3]
[4 5]
[6 7]]
如果想对二维数组进行行列交换则可以使用transpose()函数。
示例10:
import numpy as np
d = np.arange(0, 8).reshape([2, 4])
print(d)
print(np.transpose(d))
运行结果为:
[[0 1 2 3]
[4 5 6 7]]
[[0 4]
[1 5]
[2 6]
[3 7]]