Numpy02之ndarray的查询
一维数组的索引和切片
a = np.array([1,2,3,4,5,6,7]) a[3] # 单值 a[[1, 3, 4]] # 获取不连续多值 a[2:5] # 切片查询,连续多值 a[-3] # 倒查
多维数组索引和切片查询
- 索引查询
- ndarray查询
- 切片查询
总结 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
本文为原创文章,转载请标明出处