Numpy的索引使用

Numpy的索引分为:

  • 1.基础索引
  • 2.布尔索引
  • 3.神奇索引

基础索引

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])
上一篇:第二篇


下一篇:NFS共享存储