昊虹AI笔记网

 找回密码
 立即注册
搜索
查看: 908|回复: 0
收起左侧

将ndarray对象的数据按索引矩阵进行选取的几种方法

[复制链接]

239

主题

241

帖子

928

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
928
昊虹君 发表于 2022-11-9 11:11 | 显示全部楼层 |阅读模式
将ndarray对象的数据按索引矩阵进行选取的几种方法

有很多时候,我们需要把ndarray对象的数据按索引矩阵进行选择,本文就写一写此操作的常用方法。

目录
  • 01-按维度和索引选择数据
  • 02-以对象A中的值为索引挑选矩阵choices中的值形成新的矩阵
  • 03-由索引矩阵生成新的矩阵
  • 04-通过布尔值来对矩阵数据进行压缩处理


01-按维度和索引选择数据
可以用方法take()实现这个需求。
方法take()的原型如下:
  1. take(a, indices[, axis, out, mode])
复制代码

官方说明如下:
Return an array formed from the elements of a at the given indices.
示例代码如下:
  1. import numpy as np

  2. A = np.array([[1, 2, 3, 4, 5],
  3.               [6, 7, 8, 9, 10],
  4.               [11, 12, 13, 14, 15],
  5.               [16, 17, 18, 19, 20]], dtype='int8')

  6. B = A.take([1, 3], 1)
  7. C = A.take([1, 3], 0)
复制代码

运行结果如下:

代码和结果说明:
由上面的运行可以看出:
当参数indices=1时,索引表示哪一列,即按列进行数据选择。
当参数indices=0时,索引表示哪一行,即按行进行数据选择。

02-以对象A中的值为索引挑选矩阵choices中的值形成新的矩阵
可以用方法choose()实现这个功能。
方法choose()的原型如下:
  1. choose(choices[, out, mode])
复制代码

Use an index array to construct a new array from a set of choices.
示例代码如下:
  1. import numpy as np

  2. A = np.array([[0, 0, 3], [1, 0, 2], [2, 1, 0]])

  3. B = np.array([3, 7, 6, 2])

  4. C = A.choose(B)
复制代码

运行结果如下:


C的形成过程如下:
A[0, 0] = 0→B[0] = 3→C[0, 0] = 3
A[0, 1] = 0→B[0] = 3→C[0, 1] = 3
A[0, 2] = 3→B[3] = 2→C[0, 2] = 2

A[1, 0] = 1→B[1] = 7→C[1, 0] = 7
A[1, 1] = 0→B[0] = 3→C[1, 1] = 3
A[1, 2] = 2→B[2] = 6→C[1, 2] = 6

A[2, 0] = 2→B[2] = 6→C[2, 0] = 6
A[2, 1] = 1→B[1] = 7→C[2, 1] = 7
A[2, 2] = 0→B[0] = 3→C[2, 2] = 3

从上面的过程来看,A中各元素因为是作为对B的索引,所以A中各元素的最大值不能超过B中各元素的最大索引值。

如果B是二维的,则A中各元素的值是对B中每列元素的索引:
示例如下:
  1. A = np.array([[1, 0, 2], [0, 2, 0]])

  2. B = np.array([[3, 7, 6],
  3.               [1, 8, 9],
  4.               [2, 5, 4]])

  5. C = A.choose(B)
复制代码

运行结果如下:

此时C的形成过程如下:
C[0,0]的值的形成过程如下:
首先我们发现A[0, 0] = 1,由于这个1位于A中的第0列,所以我们去寻找B中第0列中索引值为1的值,即B[1, 0]的值,B[1, 0] = 1,所以A[0, 0] = 1。

C[0,1]的值的形成过程如下:
首先我们发现A[0, 1] = 0,由于这个0位于A中的第1列,所以我们去寻找B中第1列中索引值为0的值,即B[0, 1]的值,B[0, 1] = 7,所以C[0, 1] = 7。

C[0,2]的值的形成过程如下:
首先我们发现A[0, 2] = 2,由于这个2位于A中的第2列,所以我们去寻找B中第2列中索引值为2的值,即B[2, 2]的值,B[2, 2] = 4,所以C[0, 2] = 4。

C[1,0]的值的形成过程如下:
首先我们发现A[1, 0] = 0,由于这个0位于A中的第0列,所以我们去寻找B中第0列中索引值为0的值,即B[0, 0]的值,B[0, 0] = 3,所以C[1, 0] = 3。

C[1,1]的值的形成过程如下:
首先我们发现A[1, 1] = 2,由于这个2位于A中的第1列,所以我们去寻找B中第1列中索引值为2的值,即B[2, 1]的值,B[2, 1] = 5,所以C[1, 1] = 5。

C[1,2]的值的形成过程如下:
首先我们发现A[1, 2] = 0,由于这个0位于A中的第2列,所以我们去寻找B中第2列中索引值为0的值,即B[0, 2]的值,B[0, 2] = 6,所以C[1, 2] = 6。

一个实际的应用场景为:
假设B为二维矩阵,每一列为一个样本,列中的元素依次为样本的某个特征值,则我们可以通过设定A取出每个样本的某个特征值形成一个新的矩阵。
当然上面介绍的方法take()也可实现这个需求,并且似乎更直观,更简单。

关于方法choose()的参数mode说两句,参数mode影响上述例子中A中各元素的取值范围,设B中的索引最大值为n-1,

mode=‘raise’,表示A中的数必须在[0,n-1]范围内
mode=‘wrap’,表示A中的数可以是任意的整数(signed),对n取余映射到[0,n-1]范围内
mode=‘clip’, 表示A中的数可以是任意的整数(signed),负数映射为0,大于n-1的数映射为n-1

03-由索引矩阵生成新的矩阵
可以用函数take_along_axis()实现这个功能,函数take_along_axis()的使用和理解比较难,为此,我专门写了一篇博文进行介绍,详情见链接 https://www.hhai.cc/thread-120-1-1.html

04-通过布尔值来对矩阵数据进行压缩处理
可以使用方法compress()实现这个功能。
原型如下:
  1. compress(condition[, axis, out])
复制代码

示例代码如下:
  1. import numpy as np

  2. A = np.array([[1, 2], [3, 4], [5, 6]])

  3. B = A.compress([0, 1, 1], axis=0)

  4. C = A.compress([False, True], axis=1)
复制代码

运行结果如下:


分析:
语句 B = A.compress([0, 1, 1], axis=0) 代表在列方向上进行压缩,第1个数0代表某列的第0个元素被舍弃;第2个数1代表某列的第1个元素被保留;第3个数1代表某列的第2个元素被保留。
以A的第0列为例,元素1被舍弃,元素3、5被保留。
以此类推…
而语句 C = A.compress([False, True], axis=1)代表在行方向上进行压缩,第1个布尔值False代表某行的第0个元素被舍弃,第2个布尔值True代表某行的第1个元素被舍弃。
以A的第0行为例,元素1被舍弃,元素2被保留。
以此类推…
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|昊虹AI笔记网 ( 蜀ICP备2022024117号-1 )

GMT+8, 2024-5-6 18:11 , Processed in 0.050356 second(s), 31 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表