Numpy学习第二天

it2026-03-10  4

副本与视图

心得总结: np.ndarray.copy()函数会复制一个副本,从而不会更改原来的数据。

import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = x y[0] = -1 print(x) # [-1 2 3 4 5 6 7 8] x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = x.copy() y[0] = -1 print(x) # [1 2 3 4 5 6 7 8]

索引与切片

选取单个元素

指定元素的索引

x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) print(x[2]) # 3 x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) print(x[2]) # [21 22 23 24 25] print(x[2][1]) # 22 print(x[2, 1]) # 22

选取多个元素(切片)

切片操作是指抽取数组的一部分元素生成新数组。对 python 列表进行切片操作得到的数组是原数组的副本,而对 Numpy 数据进行切片操作得到的数组则是指向相同缓冲区的视图。

如果想抽取(或查看)数组的一部分,必须使用切片语法,也就是,把几个用冒号( start:stop:step ){ps:(开始:结束:步长)}隔开的数字置于方括号内。

为了更好地理解切片语法,还应该了解不明确指明起始和结束位置的情况。如省去第一个数字,numpy 会认为第一个数字是0;如省去第二个数字,numpy 则会认为第二个数字是数组的最大索引值;如省去最后一个数字,它将会被理解为1,也就是抽取所有元素而不再考虑间隔。

x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = x.copy() y[::2, :3:2] = -1 print(x) # [[11 12 13 14 15] # [16 17 18 19 20] # [21 22 23 24 25] # [26 27 28 29 30] # [31 32 33 34 35]] print(y) # [[-1 12 -1 14 15] # [16 17 18 19 20] # [-1 22 -1 24 25] # [26 27 28 29 30] # [-1 32 -1 34 35]]

ps:y[::2, :3:2] = -1,逗号前为行切片,逗号后面为列切片。这里::2指的是从第一行到最后一行,间隔两行切片,:3:2指的是从第一列到第4列(索引为3的是低4列)间隔两列的列切片

dots索引

NumPy 允许使用…表示足够多的冒号来构建完整的索引列表。

比如,如果 x 是 5 维数组:

x[1,2,…] 等于 x[1,2,:,:,:] x[…,3] 等于 x[:,:,:,:,3] x[4,…,5,:] 等于 x[4,:,:,5,:] 例:

x = np.random.randint(1, 100, [2, 2, 3]) print(x) # [[[ 5 64 75] # [57 27 31]] # # [[68 85 3] # [93 26 25]]] print(x[1, ...]) # [[68 85 3] # [93 26 25]] print(x[..., 2]) # [[75 31] # [ 3 25]]

这里x[1,…]表示取第一个维度的第2个元素与其他维度的所有元素,x[…,2]表示取一二个维度的所有元素与第三个维度的第三个元素

整数数组索引

x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) r = [0, 1, 2] print(x[r]) # [1 2 3] x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) r = [0, 1, 2] c = [2, 3, 4] y = x[r, c] print(y) # [13 19 25]

取对应[0,2]、[1,3]、[2,4]位置的元素 这种规则可以应用到取矩阵不同位置的元素上,例如取矩阵四个角上的元素:

x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) r = np.array([[0,0],[4,4]]) c = np.array([[0,4],[0,4]]) print(x[r,c])

数组迭代

apply_along_axis(func1d, axis, arr) 此函数的意思是对arr数组经过func1d的函数转换为一个新的数组,axis表示的是按行还是按列

x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = np.apply_along_axis(np.sum, 0, x) print(y) # [105 110 115 120 125] y = np.apply_along_axis(np.sum, 1, x) print(y) # [ 65 90 115 140 165] y = np.apply_along_axis(np.mean, 0, x) print(y) # [21. 22. 23. 24. 25.] y = np.apply_along_axis(np.mean, 1, x) print(y) # [13. 18. 23. 28. 33.]
最新回复(0)