Numpy02之ndarray的查询

一维数组的索引和切片

a = np.array([1,2,3,4,5,6,7])
a[3]  # 单值
a[[1, 3, 4]]  # 获取不连续多值
a[2:5]  # 切片查询,连续多值
a[-3]  # 倒查

多维数组索引和切片查询

  1. 索引查询
  2. ndarray查询
  3. 切片查询
总结
1.同一级别写在同一个括号内,每一个占位符都比上一个少一个维度,占位符少于维度的情况下默认此维度的全部数据

2.2个[]相连可能会触发花式索引、
a[[1, 0], [2, 0, 1], [3, 1, 0, 2]]  # 错误做法
a[:, [0, 1], [1, 2]]  # 错误,触发了花式索引语法

3.[[],[],[]] 0维索引,1维索引,2维索引 (从外向里数)

  

a = np.arange(24).reshape(2,3,4)
# 类list列表查询方式

a[0]
a[0][1]
a[0][1][2]

# ndarray查询

a[0]
a[0, 1]
a[0, 1, 2]

# 查询多值
a[0, 2, [1, 3]]

# 倒查
a[-2, -1, -2]

a[:]  # 简写
a[:, :, :]  # 每个维度都选中所有值
a[:, :, ::2]  # 步长

花式索引

查询复杂情况:不同行/不同列,还要一次查询出来的结果

查询 [5,15]  各个维度索引都对不上

a[0, 1, 1]  # 5
a[1, 0, 3]  # 15

a[
    [0, 1],
    [1, 0],
    [1, 3],
]

a[[0, 1], [1, 0], [1, 3]]  # [0维索引,1维,2维度],从外到里数

调整数组的顺序

调节各个维度的索引顺序就是一种变相查询  

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]]])

# 0维顺序调节
a[[1, 0]]

# 1维
a[:, [2, 0, 1]]

# 2维
a[:, :, [1, 3, 2, 0]]

# 多个维度同时调整顺序
# a[[1, 0], [2, 0, 1], [3, 1, 0, 2]]  # 错误做法
a[[1, 0]][:, [1, 0, 2]][:, :, [3, 1, 0, 2]]

布尔型索引

案例:有两个数组

  • 一个一维数组,7个值,存储姓名,有重复
  • 一个7行4列数组,存储数据,每行对应一个姓名
  • 要求选出名字 张三 对应的所有数据行
names = np.array(['张三','李四','王五','张三','王五','李四','李四'])
data = np.arange(28).reshape(7, 4)


索引查询
names[[0, 3]]

布尔查询
names[[True, False, False, True, False, False, False]]

# 查询data里 张三对应的两行
data[names == '张三']

data[names == '张三', :2]  # 0维,1维

  

逻辑运算

| & ~

或且非
data[(names == '张三') | (names == '王五')]

查询所有不是张三的人
1.names[names != '张三']
2.names[~(names == '张三')]  # 非运算

  

返回指定条件元素所在位置索引

  • 之前的查询都是知道索引,查询值
  • 现在的查询是知道值,查询索引
a = np.array([[1,2,3,4],[5,4,7,8]])

根据条件查询值
a[a > 2]

查询所有符合条件的索引:np.where()
np.where(a > 2)  # 竖着看
result:
(array([0, 0, 1, 1, 1, 1], dtype=int64),
 array([2, 3, 0, 1, 2, 3], dtype=int64))
# 0维索引
# 1维索引

b = np.array([[[1,2,3,4],[5,4,7,8]],[[1,4,3,2],[5,2,1,8]]])
b[b == 4] # [0,0,3], [0,1,1], [1,0,1] 
np.where(b == 4)
result:
(array([0, 0, 1], dtype=int64),
 array([0, 1, 0], dtype=int64),
 array([3, 1, 1], dtype=int64))

np.where 高级操作

基础操作,只有一个参数,高级操作有3个参数

  

例子:生成一个由-1和1构成的一维随机数数组

1:生成由-1和0组成的数组

a = np.random.randint(-1, 1, 100)

# 使用numpy的np.where替换实现
# 如运算简单可以用方法2替代
np.where(a == 0, 1, -1)  # 条件为真,返回第一个参数,为假返回第二个参数

向量化运算,直接查询后赋值
b = a.copy()
b[b == 0] = 1

  

  

  

  

本文为原创文章,转载请标明出处
原文地址:https://www.cnblogs.com/harden13/p/14136498.html