ndarray对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样。
获取一维数组元素
以下示例, 说明了numpy如何获取一维数组的元素:
nd1=np.arange(10)#获取指定位置的数据,获取第4个元素nd1[3] # 3#截取一段数据nd1[3:6] # array([3, 4, 5])
slice
ndarray 数组可以基于 0 - n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
a = np.arange(10)s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2print (a[s])
输出:
[2 4 6]
设置间隔
以上实例中,我们也可以通过冒号分隔切片参数 start:stop:step 来进行切片操作:
a = np.arange(10)b = a[2:7:2]
将间隔设置为负数,达到倒序取数的目的:
a[::-2] # array([9, 7, 5, 3, 1])
获取多维数组元素
以下示例, 说明了numpy如何获取多维数组的元素,先创建一个5*5的数组:
nd2=np.arange(25).reshape([5,5])
array([[ 0, 1, 2, 3, 4],[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14],[15, 16, 17, 18, 19],[20, 21, 22, 23, 24]])
获取指定位置的元素:
nd2[0][0] # 0
获取全部元素:
nd2[:, :]
截取区域内数据
截取一个多维数组的一个区域内数据
nd2[1:3,1:3]
输出:
array([[ 6, 7],[11, 12]])
截取范围内数据
截取一个多维数组中,数值在一个值域之内的数据 (多维数组将展开)
nd2[(nd2>3)&(nd2<10)]
输出:
array([4, 5, 6, 7, 8, 9])
截取整行或整列
获取某一行:
nd2[0] # array([0, 1, 2, 3, 4])
截取多维数组中,指定的行,如读取第2,3行
nd2[[1,2]] # 或 nd2[1:3, :]
输出:
array([[ 5, 6, 7, 8, 9],[10, 11, 12, 13, 14]])
截取多维数组中,指定的列,如读取第2,3列
nd2[:,1:3]
输出:
array([[ 1, 2],[ 6, 7],[11, 12],[16, 17],[21, 22]])
多维数组操作有些抽象, 可参考下图:
通过 … 获取某个维度的全部元素
切片还可以包括省略号 ... ,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
a = np.arange(9).reshape([3,3])print(a)print(a[...,1]) # 第2列元素print(a[1,...]) # 第2行元素print(a[...,1:]) # 第2列及剩下的所有元素
输出:
[[0 1 2][3 4 5][6 7 8]][1 4 7][3 4 5][[1 2][4 5][7 8]]
拷贝
通过 copy 方法可以生成数组及其数据的完整副本。
>>> a = np.arange(int(1e3))>>> b = a.copy()>>> b is aFalse>>> b = a[:100].copy()>>> del a
增加维度
通过 np.newaxis ,可以增加数组的维度:
a = np.array([1,2,3])b = a[:, np.newaxis]print(b)
输出:
[[1][2][3]]
