本文已参与「新人创作礼」活动,一起开启掘金创作之路
索引
基本索引
z=np.arange(8)
zm = slice(2,5,2)
print(z[zm])
# [2 4]
slice可以表示索引。slice(start,stop,step)
切片索引
[ ] 用法和之前相同,也是包括左端点不包括右断点。...可以代表一行或一列。
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a[1:]
#array([[ 5, 6, 7, 8],
# [ 9, 10, 11, 12]])
a[...,1] #只找某一列
#array([ 2, 6, 10])
还可以从两个列表中抽取,第一个列表表示行索引,第二个列表表示列索引。
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a[2,1]
# 10
同时,索引具有广播机制。即两个列表中的索引数量,自动填充成一样的。例如array[[x1],[y1,y2]] 会自动填充成array[[x1x1],[y1,y2]]
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a[[0],[1,2]]
# array([2, 3])
a[:3,[1,2]]
#array([[ 2, 3],
# [ 6, 7],
# [10, 11]])
数组比列表多了一个列表索引,扩展了列表的功能,广播机制避免重复赋值
整数数组索引
比如希望找到多个位置的数字。可以构造两个列表,第一个代表行,第二个代表列,两个元组必须是相对应的。 例如,需要寻找(0,0) (1,2) (2,3)
a=np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12]])
a[[0,1,2],[0,2,3]]
# array([ 1, 7, 12])
布尔索引
利用布尔条件进行索引。
a[a>6]
# array([ 7, 8, 9, 10, 11, 12])
花式索引
利用整数数组进行索引,这里的整数数组可以是Numpy数组也可以是Python中列表、元组等可迭代类型。 花式索引根据索引整型数组的值作为目标数组的某个轴的下标来取值。
- 如果目标是一维数组,那么索引的结果就是对应下标的行;
- 如果目标是二维数组,那么就是对应位置的元素。
x=np.arange(12).reshape((3,4))
x
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11]])
x[[1,0]]
#array([[4, 5, 6, 7],
# [0, 1, 2, 3]])
x[[-3,-1,-2]]
#array([[ 0, 1, 2, 3],
# [ 8, 9, 10, 11],
# [ 4, 5, 6, 7]])
x[np.ix_([1,2,0],[2,0,1,3])]
#array([[ 6, 4, 5, 7],
# [10, 8, 9, 11],
# [ 2, 0, 1, 3]])
最后一个需要特殊说明一下。最后一个函数 np.ix_ 可以选择多个索引,并重新组合成新的数组。 例子中也就是,先固定第一个数组的1行,再选择列的2,0,1,3;然后再从第一个数组的2行,选择列的2,0,1,3;最后从第一个数组的最后0行,再选择列的2,0,1,3,最后构成了一个新的数组。