python中reshape函数用法(了解python内置函数)

今天这篇是numpy专题的第四篇文章,numpy中的数组重塑与三元表达式。

首先我们来看数组重塑,所谓的重塑本质上就是改变数组的shape。在保证数组当中所有元素不变的前提下,变更数组形状的操作。比如常用的操作主要有两个,一个是转置,另外一个是reshape。

转置与reshape

转置操作很简单,它对应线性代数当中的转置矩阵这个概念,也就是说它的功能就是将一个矩阵进行转置

转置矩阵的定义是将一个矩阵的横行写为转置矩阵的纵列,把纵列写成转置矩阵的横行。这个定义的是二维的矩阵,本质上来说,转置操作其实是将一个矩阵沿着矩阵的大对角线进行翻转。翻转之后,显然这个矩阵的各个维度都会发生变化。

其中二维的矩阵最直观,一个4 x 3的矩阵,转置之后得到的是3 x 4的矩阵。如果维度更多呢?如果是3 x 2 x 4的矩阵转置之后会得到什么?

很简单,得到的会是4 x 2 x 3的矩阵。我们都知道,如果我们把一个矩阵各个维度的大小写在一起,会得到一个元组(tuple),这个元组称为矩阵的shape,我实在是不知道该怎么翻译这个单词,但是我觉得叫做形状不太妥当,所以就保留了英文原文。转置之后,矩阵的shape会整个翻转。比如(3, 2, 4)会变成(4, 2, 3)。

我们可以来看一个例子,会更加的直观。首先我们先看最简单的二维矩阵:

这是随机出来的一个3 x 4的二维矩阵,在numpy当中,有两种方式获取一个矩阵或者是数组的转置。第一种方式是通过在数组的变量名之后加上.T操作符,第二种方式是调用numpy中的transpose函数,这两种方式是一样的。我个人比较倾向于前者,写起来比较简单。

我们可以看到转置之后新的矩阵的第一列其实是原矩阵的第一行,第一行是原矩阵的第一列。可以看成是原矩阵按照从左上角到右下角的一条无形的线翻转之后的结果。

理解了转置之后,我们再来看reshape操作。其实我们从这个单词上也能大概猜到它的意思,reshape也就是再次shape的意思,本意是根据我们想要的shape重新组装矩阵当中的元素

我们来看一个例子吧,首先,我们通过arange方法来获取一个一维的数组:

因为是1维的,所以我们去看它的shape也只有一维。假设我们不喜欢这样的一维数组,而想把它变成3 x 4或者是6 x 2的格式,这时候使用reshape就会很方便。

本质上来说reshape操作其实就是按照顺序从矩阵当中获取元素,然后按照我们制定的shape填充出一个新的矩阵的操作。这个应该不难理解, 它也是非常常用的重塑操作,通过reshape和转置,我们可以很方便地操作矩阵的大小,根据我们的需要作出改变。

三元表达式

在许多编程语言当中我们经常会用到三元表达式,三元表达式其实本质就是if-else语句,只是我们用特殊的方法将它简写。

比如说在C++当中,我们可以把if condition A else B简写成:condition ? A : B。Python同样支持三元表达式,不过对C++的三元表达式做了一些改动,在Python当中三元表达式写成:A if condition else B。相对来说更加直观一些,我们经常会在数组初始化的时候用到三元表达式。

比如,我们可能会这样生成一个数组:

arr = [1 if condition else 0 for _ in range(10)]

我们通过条件来判断了每一位是1还是0来生成了一个数组,简化了代码。在numpy当中同样继承了这个用法,我们一样可以使用三元表达式,不过numpy将它封装进了where函数当中,我们是通过调用一个方法来实现三元表达式的功能。我们来看下具体的用法,假设我们有两个数组:

我们还有一个bool型的数组c,我们希望根据c数组选择从a数组或者是b数组当中获取数据。我们可以使用where写成这样:

在这个例子当中,c数组中的1和0分别表示True和False。当我们调用np.where的时候,numpy会自动根据c数组当中的值去选择从a数组还是b数组当中获取数据。相当于我们执行了这么一段代码:

[x if c else y for c, x, y in zip(c, a, b)]

虽然两者的运行结果是一样的,但是显然使用循环的方法计算耗时更长,而使用numpy的向量做法运算速度更快。除此之外,numpy的where方法还支持高维的数组,但是循环的方法不行。并且where还有一些更高级的用法,比如说我们传入的第二个和第三个参数,可以不是数组而是一个标量。比如我们可以指定当c中的元素是True的时候填入1,否则填入-1:

甚至我们还可以将标量和向量结合起来使用:

并且这里的数组c也可以替换成逻辑运算:

总结

今天的文章主要介绍了Numpy当中的reshape、转置以及where的用法,这些也是numpy的基础用法,尤其是转置、reshape,几乎是处理数据必用的方法。所以想要从事Python机器学习或者是人工智能的小伙伴,numpy的这些用法是一定要会的。

本文当中介绍的只是numpy的一些固定套路,但其实numpy很多的用法是可以组合的,一些看似平淡无奇的用法组合在一起之后会有神奇的效果。这一点光看书或者是资料是很难穷尽的,所以如果你已经学会了这些api的基本使用,接下来最应该做的是去读一些大牛的源码,看看大牛们是如何运用这些工具的,相信一定还会有新的收获。

感谢您访问:美文云网站!本文永久链接:https://meiwenyun.com/429038.html。侵删或不良信息举报请联系邮箱:820608633@qq.com或微信:meiwenyun888。
上一篇 2024年8月19日 03:46
下一篇 2024年8月19日 03:46

相关推荐

  • 眼球内异物的处理原则有哪些

    球内异物伤病人多数是在受伤初期即来就诊,有明确的外伤史和显而易见的眼球穿孔。但也有的病人是发生了并发症后才来看病的,外伤史不明确,眼球上也看不到穿孔伤口或受伤者,当时未出现任何症状…

    2022年12月30日
    311
  • 天人菊的种植方法和注意事项 宿根天人菊什么时候播种

    天人菊的花朵十分的娇媚,色泽明艳动人,而且拥有比较长的花期,经常会作为一种园林的装饰而存在,观赏价值很高,受到了很多人的喜爱。那么天人菊到底应该如何种植才能达到最好的效果呢?接下来…

    2024年8月4日
    271
  • 蓝牙能看到对方手机里的什么(15秒前已更新)

    1、不能。蓝牙功能是用来连接两台设备,然后进行数据传输,不能查看对方手机里的东西,只能接收、查看对方发过来的文件。 2、我的手机可以喔!只要对方的手机在五米左右的范围内,点入蓝牙列…

    2023年4月19日
    393
  • 硬头鳟的养殖

    硬头鳟为洄游性冷水鱼类,也称钢头鳟,在淡水至盐度为10%的水体中均可良好生存和生长,可生存水温为0.6℃至25℃,最适生长水温10℃至18℃;栖息条件要求水质清洁、水量充沛、氧气充…

    2022年12月30日
    349
  • 为什么有的人脚大有的人脚小 男孩56码大脚丫愁坏老妈

    最近,一男孩56码大脚丫愁坏老妈的新闻上了热搜,一般男生的脚都在43码左右,56码的脚确实是很大了,也不常见。那么为什么有的人脚大有的人脚小?下面小编带来介绍。 男孩56码大脚丫愁…

    2024年8月4日
    201
  • 牛皮癣的诊断方法,请看这里

    现如今人们都在快节奏的生活,有些时候知道自己这块难受,但是为了工作,也就忍着,其实这种做法是错误的。万一您患上了牛皮癣,您越拖病情就会越重,为了自己的健康着想,我们就要认识牛皮癣,…

    2023年1月1日
    314
分享本页
返回顶部