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

相关推荐

  • 乔峰是第几代丐帮帮主

    1、乔峰是第九代丐帮帮主。萧峰曾就任丐帮帮主,善使降龙十八系列里面的“降龙十八掌”。在得知自己的契丹身世又遭人诬陷后被迫退位;之后因缘际会相继与段誉和虚竹结为异姓兄弟,在落难时又得…

    2023年4月18日
    697
  • 玉兰花寓意和象征意义 玉兰花花语是什么

    上班的路上,抬头看窗外时,惊喜得发现路边的玉兰花已经盛开了。 洁白的、紫色的、粉色的花朵,大若圆盘,密密麻麻。一树繁花,竞相开放! 每年春天,都期待玉兰花的绽放。树叶还没有吐绿时,…

    2024年8月4日
    325
  • 江西省有几个市 江西有哪些地方

    江西总共有11个地级市,分别是南昌市、九江市、上饶市、抚州市、宜春市、吉安市、赣州市、景德镇市、萍乡市、新余市、鹰潭市。江西省的省会是南昌,南昌的红色文化非常出名,著名的根据地有井…

    2024年8月5日
    383
  • 宣纸的分类有哪几种 宣纸的种类有哪些

    宣纸按原料分类,分为特种净皮类、净皮类、棉料类三大类;按纸纹分类,分为单丝路、双丝路;按加工方法分类,分为生宣、半熟宣、熟宣;按厚薄分类,分为扎花、绵连、单宣、重单、夹宣、二层、多…

    2024年8月12日
    318
  • 兰花栽培土怎样配(自制兰花土配方大全)

    兰花具有较高的观赏性,许多人家里都会养上这么一盆。适合养殖兰花的土壤主要有三种:有机土壤;松软土壤;混合型土壤,这三种土壤制作不难,下面就为你分别讲解如何制作。 1.有机土壤 兰花…

    2024年4月4日
    355
  • pdf怎么转曲线格式(pdf最安全的转曲方法)

    pdf文件是我们最常用到的一种文件格式,当我们有什么不想让旁人改动的文件时,就会想将其转换为pdf。这样看起来更加正式,而且也防止了自己的文件被别人篡改。只是对于一些人来说,每次要…

    2024年8月23日
    353
分享本页
返回顶部