花式索引的定义
花式索引(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])]