NumPy学习笔记 - “切片法”理解多维矩阵

简介

NumPy库主要用于数组(矩阵)计算,包含:

  • 一个强大的N维数组对象 ndarray
  • 广播功能函数
  • 整合 C/C++/Fortran 代码的工具
  • 线性代数、傅里叶变换、随机数生成等功能

学习文档:NumPy教程

该教程中有个词:n-uplet,uplet是法语中的元组(tuplet),n-uplet即n元组。
如何理解数组,尤其是多维数组及NumPy中的AXES(Dimensions, Rank)和Axies(Dimension)等概念,是掌握NumPy的基础。

在我个人的学习过程中发现,如果按传统的行列的概念去理解NumPy的一些基本概念可能会造成混淆,尤其是对稍微复杂一些的索引、切片、整数数组索引、花式索引以及argmax等。但如果按“纬度切片”的方式去理解这些概念,会轻松很多。

基本概念

首先,图示Array类的AXES及Axies的概念。

  • 二维数组
    图一:二维数组
    如上图,NumPy中,AXES就是维度总数(Dimensions,也可以理解为坐标系),Rank就是坐标系中坐标轴的总数,二维数组的Rank等于2,ndim属性也等于2。二维数组有两个Axies(Dimension,也可以称为坐标轴),Axies0是垂直方向的坐标轴(Y轴),Axies1是水平方向的坐标轴(X轴)。
    再看下面两幅图,即Axies0和Axies1的切片。
    • Axies0切片
      在这里插入图片描述

    • Axies1切片
      在这里插入图片描述

如上两幅图所示,沿着垂直方向(Axies0)可以划分为2个切片,水平方向(Axies1)可以划分为两个切片。
因此,NumPy中Array类的属性Shape就很好理解了,shape=[2, 3]。

  • 三维数组

在这里插入图片描述
对于三位数组,Rank = ndim = 3,Axies0是深度(坐标轴的Z轴),Axies1是Y轴,Axies0是X轴。
在这里插入图片描述

在这里插入图片描述
Axies0可以划分为三个切片,Axies1可以划分为3个切片,Axies0可以划分为三个切片,因此,shape=[3,3,3]。

index及slicing

  • index
    以二维数组为例,索引b[0, 1] = “Axies0的0号切片([1, 2])与Axies1的1号切片([2, 4, 6])”产生的交集所对应的元素。
In [1]: b = array([[1,2],
                   [3,4],
                   [5,6]])
In [2]: b
Out[2]: 
array([[1, 2],
       [3, 4],
       [5, 6]])
In [3]: b[0,1]
Out[3]: 2
  • slicing
In [1]: c = array([[ 0, 1, 2, 3],
[10, 11, 12, 13],
[20, 21, 22, 23],
[30, 31, 32, 33],
[40, 41, 42, 43]])

In [2]: c
Out[2]: 
array([[ 0,  1,  2,  3],
       [10, 11, 12, 13],
       [20, 21, 22, 23],
       [30, 31, 32, 33],
       [40, 41, 42, 43]])

In [3]: c[0:5, 1]
Out[3]: array([ 1, 11, 21, 31, 41])

切片c[0:5, 1] = 取Axies0的编号为0 - 4的切片与Axies1的编号为1的切片所产生的交集所对应的元素。

argmax

沿给定轴返回最大元素的索引。
还是以上面的三维数组为例。

  • argmax(0)
#Axies0方向(Z轴)的三个切片(每个切片都是一个2维数组)分别是:
#第一个切片数组
[1, 2, 3]
[3, 4, 5]
[6, 7, 8]

#第二个切片数组
[6, 7, 8]
[3, 4, 5]
[1, 2, 3]

#第三个切片数组
[1, 2, 3]
[6, 7, 8]
[3, 4, 5]

沿axies0(Z轴方向),依次取每个切片对应的二维数组的元素(按[Axies0, Axies1],即从上至下、从左至右)比较每个元素,并返回最大元素的索引。
所以结果就是:

[1, 1, 1]
[2, 2, 2]
[0, 0, 0]

同理:

  • argmax(1)
#Axies1方向(Y轴)的三个切片(每个切片都是一个2维数组)分别是:
#第一个切片数组
[1, 2, 3]
[6, 7, 8]
[1, 2, 3]

#第二个切片数组
[3, 4, 5]
[3, 4, 5]
[6, 7, 8]

#第三个切片数组
[6, 7, 8]
[1, 2, 3]
[3, 4, 5]

沿Axies1(Y轴方向),依次取每个切片对应的二维数组的元素(因为切片是Y轴的切片,所以切片数组中,原三维数组Z轴的数据变为Axies0的数据,原三维数组X轴的数据变为Axies1的数据),比较每个元素,并返回最大元素的索引。

所以结果就是:

[2, 2, 2]
[0, 0, 0]
[1, 1, 1]
  • argmax(2)
    不做累述,结果是:
[2, 2, 2]
[2, 2, 2]
[2, 2, 2]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

steventian72

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

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

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

打赏作者

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

抵扣说明:

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

余额充值