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 停止,间隔为2
print (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 a
False
>>> b = a[:100].copy()
>>> del a
增加维度
通过 np.newaxis
,可以增加数组的维度:
a = np.array([1,2,3])
b = a[:, np.newaxis]
print(b)
输出:
[[1]
[2]
[3]]