Numpy的索引分为:
基础索引
import numpy as np
一维数组
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[:4]
array([0, 1, 2, 3])
x[2:-1]
array([2, 3, 4, 5, 6, 7, 8])
x[-3:]
array([7, 8, 9])
x[:-3]
array([0, 1, 2, 3, 4, 5, 6])
二维数组
X=np.arange(20).reshape(4,5)
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
# 使用行坐标 列坐标 实现行列筛选
X[0,0] # 第一行第一个元素等于X[0][0]
0
X[-1,2] # 最后一行的第三列
17
X[2] # 第三行
array([10, 11, 12, 13, 14])
X[-1] # 最后一行
array([15, 16, 17, 18, 19])
X[:-1] # 除去最后一行所有的行
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
X[:2,2:4] # 筛选出前两行的第三列到第四列
array([[2, 3],
[7, 8]])
X[:,2] # 所有行的第三列元素
array([ 2, 7, 12, 17])
注意:切片的修改会改变原来的数组
- 原因:Numpy经常需要处理大数组,需要避免每次都复制
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[2:4]=666
x
array([ 0, 1, 666, 666, 4, 5, 6, 7, 8, 9])
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
X[0,:2]=666
X
array([[666, 666, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[ 10, 11, 12, 13, 14],
[ 15, 16, 17, 18, 19]])
神奇索引
一维数组
x=np.random.randint(10,size=10)
x
array([9, 9, 1, 4, 0, 8, 0, 0, 4, 0])
x[[1,4,0]] # 通过索引返回元素
array([9, 0, 9])
index=np.array([[0,2],[1,3]]) # 通过索引返回元素
x[index]
array([[9, 1],
[9, 4]])
实例:获取数组中最大的前N个数
# 随机生成1-100之间的10个数
arr=np.random.randint(1,100,size=10)
arr
array([56, 5, 93, 30, 63, 56, 11, 92, 26, 86])
arr=np.sort(arr) # 排序,升序
arr
array([ 2, 8, 10, 16, 27, 42, 47, 55, 81, 92])
arr.argsort()[-3:] # arr.argsort()会返回排序后的索引index
array([9, 7, 2], dtype=int64)
arr[arr.argsort()[-3:]] # 获取最大值对应的三个下标
array([86, 92, 93])
二维数组
X=np.arange(20).reshape(4,5)
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
# 筛选多行,列可以省略
X[[0,2]]
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
X[[0,2],:] # 和上面一样
array([[ 0, 1, 2, 3, 4],
[10, 11, 12, 13, 14]])
# 筛选多列,省略行
X[:,[0,2,3]]
array([[ 0, 2, 3],
[ 5, 7, 8],
[10, 12, 13],
[15, 17, 18]])
# 筛选多行 多列
# 等同于(0,1)第一行的第二列元素(2,3)第三行第四列元素(3,4)第四行第五列元素
X[[0,2,3],[1,3,4]]
array([ 1, 13, 19])
布尔索引
一维数组
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x>5
array([False, False, False, False, False, False, True, True, True,
True])
x[x>5] # 筛选出大于5的元素
array([6, 7, 8, 9])
实例:把一维数组进行01转换
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[x<=5]=0
x
x[x>5]=1
x
array([0, 0, 0, 0, 0, 0, 1, 1, 1, 1])
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
x[x<5]+=20
x
array([20, 21, 22, 23, 24, 5, 6, 7, 8, 9])
二维数组
X=np.arange(20).reshape(4,5)
X
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
X>5
array([[False, False, False, False, False],
[False, True, True, True, True],
[ True, True, True, True, True],
[ True, True, True, True, True]])
X[X>5]
array([ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19])
X[:,3]
array([ 3, 8, 13, 18])
X[:,3]>5
array([False, True, True, True])
X[X>=5]=666
X
array([[ 0, 1, 2, 3, 4],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666]])
X[X[:,3]>5]=666
X
array([[ 0, 1, 2, 3, 4],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666],
[666, 666, 666, 666, 666]])
条件的组合
x=np.arange(10)
x
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 注意每个条件都要加小括号
condition=(x%2==0)|(x>7)
condition
array([ True, False, True, False, True, False, True, False, True,
True])
x[condition]
array([0, 2, 4, 6, 8, 9])