笔记 | numpy-08.高级索引

#%%
# NumPy 比一般的 Python 序列提供更多的索引方式。除了之前看到的用整数和切片的索引外,数组可以由整数数组索引、布尔索引及花式索引
#%% md
## 整数数组索引
#%%
import numpy as np

x = np.array([
    [1, 2],
    [3, 4],
    [5, 6]
])
y = x[[0, 1, 2], [0, 1, 0]] # 分别取 x的 x[0,0] = 1 x[1,1] = 4 x[2,0] = 5
y
#%%
# 以下实例获取了 4X3 数组中的四个角的元素。 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]
x = np.array([
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [9, 10, 11]
])

x
#%%
rows = np.array([[0, 0], [3, 3]]) # r 行索引 0=r0, 2=r0, 9=r3, 11=r3
cols = np.array([[0, 2], [0, 2]]) # r 行索引 0=c0, 2=c2, 9=c0, 11=c2
y = x[rows, cols]
y
#%%
# 可以借助切片 : 或 … 与索引数组组合
import numpy as np

a = np.array([
    [1, 2, 3],
    [4, 5, 6],
    [7, 8, 9]
])
a
#%%
a[1:3, 1:3] # 行索引1,2 列索引1,2 [[5,6],[8,9]]
#%%
a[1:3, [1,2]] # 行索引1,2 列索引1,2 同上
#%%
a[...,1:] # 所有行, 列索引1开始到最后 [[2,3], [5,6], [8,9]]
#%% md
## 布尔索引
我们可以通过一个布尔数组来索引目标数组
布尔索引通过布尔运算 (如:比较运算符) 来获取符合指定条件的元素的数组
#%%
# 获取大于 5 的元素
x = np.array([
    [0, 1, 2],
    [3, 4, 5],
    [6, 7, 8],
    [9, 10, 11]
])
x
#%%
b = x > 5 # nr1c
b
#%%
x[b]
#%%
# 使用了 ~ (取补运算符) 来过滤 NaN
import numpy as np

a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])
a
#%%
b = ~np.isnan(a)
b
#%%
a[b]
#%%
# 从数组中过滤掉非复数元素 | 保留复数
a = np.array([1, 2+6j, 5, 3.5+5j])
a
#%%
b = np.iscomplex(a)
b
#%%
a[b]
#%% md
## 花式索引
花式索引指的是利用整数数组进行索引
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应下标的行,如果目标是二维数组,那么就是对应位置的元素
花式索引跟切片不一样,它总是将数据复制到新数组中
#%%
# 传入顺序索引数组
import numpy as np

x = np.arange(32) # 0~32(不含32)
x = x.reshape((8, 4)) # 8r4c
x
#%%
x[[4,2,1,7]] # 分别取 索引行4,2,1,7 依次按照索引给予的顺序进行
#%%
# 传入倒序索引数组
x[[-4,-2,-1,-7]] # 从下往上 -1是最后一行 | 长度+索引=真实索引 | 4, 6, 7, 1
#%%
b = np.ix_([1, 5, 7, 2], [0, 3, 1, 2])
b[0]
#%%
b[1]
#%%
# 传入多个索引数组 (要使用np.ix_)
"""
索引行 1的 索引列 0,3,1,2
索引行 5的 索引列 0,3,1,2
索引行 7的 索引列 0,3,1,2
索引行 2的 索引列 0,3,1,2
"""
x[b]
#%%
x[[1, 5, 7, 2], [0, 3, 1, 2]] # 不使用 np.ix_ 就会获取4个元素 依次 x[1,0], x[5,3], x[7,1] x[2,2]
#%%

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值