python 花式索引

花式索引的定义

花式索引(Fancy indexing)是指利用整数数组进行索引,这里的整数数组可以是Numpy数组也可以是Python中列表、元组等可迭代类型。

一维数组的花式索引

创建一维数组arr1 = np.array([1.0,2,3,4])
花式索引arr1[1:4]获得[0,2,3] 不包含下标4

import numpy as np
#创建一维数组
arr1 = np.array([1,2,3,4])
print(arr1[1:4])

结果

在这里插入图片描述
如果数组有浮点数,那就会建立浮点数数组

二维数组的花式索引

  • 花式索引获得指定下标的值
    -(0,0)(2,2)(3,3)
    • arr2[(0,2,3),(0,2,3)]
    • x,y一一对应
    • 也可以使用arr2[[0,2,3],[0,2,3]]效果是一样的

关于花式索引与其他索引组合比较详细的介绍

https://blog.csdn.net/wizardforcel/article/details/85850021

arr2 = np.array([[1,2,3,4,5],
                [4,5,6,7,8],
                [7,8,9,10,11],
                [10,11,12,13,14]])
# 得到的是(0,0),(2,2),(3,3)              
print(arr2[(0,2,3),(0,2,3)])
#索引第2,3行中的第0,2,3列(不连续的列使用元组或列表表示)
print(arr2[2:4,(0,2,3)])

最难的部分

花式索引如何随机选择行列

问题:如何获取(0,2,3)行的(0,2,3)列

  • 方法一、原理上和下面的numpy.ix_()函数差不多,直接把用函数的转换过程省略了,但这个方法是最难理解的,通过numpy.ix()官方文档才明白(最初接触到的是这个方法,查了很久才明白)
    • arr2[[[0],[2],[3]],(0,2,3)]
    • 原理是维度匹配,维度相同一一匹配,维度不同每一个都匹配

    这个的解释也不错
    https://zhuanlan.zhihu.com/p/123858781

  • 方法二、先取列,再取行(反过来也行)。这个是最容易理解的方法
    • arr2[:,[0,2,3]][[0,2,3]]
  • 方法三、用numpy.ix_()函数
    • arr2[np.ix_([0,2,3],[0,2,3])]
    • 官方文档机翻,勉强能看
      在这里插入图片描述

以下是代码

# 花式索引
arr2[[[0],[2],[3]],(0,2,3)] # [[0],[2],[3]]与(0,2,3)维度不同。每一个都会与(0,2,3)内所有元素相匹配一次
arr2[[[0],[2],[3]],[[0],[2],[3]]] # 维度相同,对应匹配
arr2[[0,2,3],2] # [0,2,3]都会与2匹配一次
arr2[(0,2,3),[[0],[2],[3]]]
arr2[([0],[2],[3]),(0,2,3)]
arr2[(0,2,3),([0],[2],[3])]
# =========================
arr3=arr2[:,[0,2,3]] # 先获得列
arr3[[0,2,3]] # 再从中选择行 (反过来也行
# 合并一下
# 因为花式索引返回的是ndarray,所以可以直接这样求
arr2[:,[0,2,3]][[0,2,3]] 
# =========================
# numpy.ix_(*args) 返回值为ndarray元组
# np.ix_函数就是输入两个数组,产生笛卡尔积的映射关系
# np.ix_函数,能把两个一维数组转换为 一个用于选取方形区域的索引器
np.ix_([0,2,3],[0,2,3]) # 返回了(array([[0],[2],[3]]),array([[0, 2, 3]]))
arr2[np.ix_([0,2,3],[0,2,3])]
  • 7
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值