《手把手陪您学Python》49——数组的shape属性

在上一篇《手把手陪您学Python》48——数组的生成方法1中,我们学习了array()、arange()以及linspace()三种生成数组的方法,并且了解了数组是使用嵌套列表的方式进行表示的。

今天,我们将会学习数组的shape属性,并更深入地了解数组特别是多维数组的表示方式。

1、shape属性

数组的shape属性就如同它的名字一样,反映的是数组的“形状”。

对于一维数组,反映的是一个维度上的元素数量,类似“长度”;

对于二维数组,反映的是两个维度上分别的元素数量,类似“长度”和“宽度”;

对于三维数组,反映的是三个维度上分别的元素数量,类似“长度”、“宽度”和“高度”。

对于四维以及更高的维度,虽然无法准确地用词语来表示每一个维度的名字,但其shape属性同样反映的是每一个维度上分别的元素数量。

下面,我们利用上节课所学的数组生成方法,看一下生成的数组的属性,或者说生成的数组都是什么“形状”的。

2、一维数组

In [1]: import numpy as np

In [2]: data1 = [1, 2, 3, 4, 5, 6]
        arr1 = np.array(data1)   # 生成一维数组
        arr1
Out[2]: array([1, 2, 3, 4, 5, 6])

In [3]: arr1.shape
Out[3]: (6,)

上例的一维数组是由一个有6个元素的列表组成的,只有一行数据,长度为6,它的shape属性只有一个数字6,代表它是一维数组,且元素的个数为6。

同时,我们注意到,shape属性是用元组来表示的,当只有1个元素时,并不是用(6)来表示的,而应该用(6, )来表示。大家可以点击链接《手把手陪您学Python》21——元组来回顾其中的内容。

由于我们刚刚学习了面向对象的编程,对于“属性”有了更进一步地认识。当我们再看到arr1.shape的时候,就和刚学习Python时不一样了。

我们可以知道,arr1实际是“数组类”的实例化,而shape是“数组类”的一个类属性,所以才有了arr1.shape这样调用类属性的过程。

大家也可以点击链接《手把手陪您学Python》40——类的定义、属性与实例化来回顾上述内容和概念。

3、二维数组

了解了一维数组的shape属性和shape属性的表示方法,二维数组就非常简单了。

In [4]: data2 = [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12]
        arr2 = np.array(data2)   # 生成二维数组
        arr2
Out[4]: array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])

In [5]: arr2.shape
Out[5]: (2, 6)

二维数组实际上是由嵌套列表或者嵌套列表的元组组成的,它的shape属性是由两个元素组成的元组。

在上篇文章中我们说过,当省略外层的[]或()时,默认为(),也就是元组。

为了便于阅读,后面无论是写了[]或(),还是省略了[]或(),我们会统一称之为列表,当出现嵌套的形式时,也统一称之为列表,但实际上,列表和元组都是可以的,我们不再每次都严格地进行描述。

在二维数组的shape属性中,第一个元素为2,我们可以将其理解为有2行数据。从最后的打印结果中也可以看到。第一行数据为1、2、3、4、5、6,第二行数据为7、8、9、10、11、12。同时,每一行有6个元素,形成6列数据。所以,二维数组的shape属性代表着几行几列。

需要注意的是,这样的理解方式或者说数组的打印形式,只对一维和二维数组有效,对于三维和三维以上的数组来说,就无法这么直观地理解或者打印了。

那么,我们应该如何准确地理解数组的shape属性呢?

实际上,shape属性的元组值代表着列表嵌套的层级数(对应元组的元素个数)和列表元素的个数(对应元组的元素值)。

对于一维数组arr1来说,列表只有1层,所以元组只有1个元素。列表有6个元素,所以元组唯一的一个元素的值为6。所以,最后的结果是(6, )。

对于二维数组arr2来说,列表有2层,所以元组有2个元素。其中,最外层列表由2个元素组成(每个元素都是一个列表),所以元组的第一个元素值是2;内层的每一个列表都有6个元素,所以元组的第二个元素值是6。所以,最后的结果是(2, 6)。

在上一篇文章中,我们做过如下的实例:

In [6]: data3 = [1, 2, 3, 4, 5, 6], [7, 8, 9, 10, 11, 12], [13, 14, 15, 16, 17, 18]
        arr3 = np.array(data3)
        arr3
Out[6]: array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12],
       [13, 14, 15, 16, 17, 18]])

 

根据上面所学的知识,我们可以知道,因为是两层的嵌套列表,所以生成的是一个二维数组,shape属性是有2个元素的元组。因为外层的列表是由3个列表元素组成的,所以元组的第一个元素是3;内层的列表有6个元素,所以元组的第二个元素是6。所以,arr3的shape属性是(3, 6)。

从arr3的打印结果来看,是一个由3行6列数据组成的数组,所以shape属性也应该是(3, 6)。

让我们验证一下:

In [7]: arr3.shape
Out[7]: (3, 6)

4、三维数组

同理,三维数组的shape属性就应该是由3层嵌套的列表组成,元组的元素个数就应该为3。

其中,最外层(第1层)的列表元素个数,就是元组第一个元素的值;中间层(第2层)的列表元素个数,就是元组第二个元素的值;最内层(第3层)的列表元素个数,就是元组第三个元素的值。

如果从“形状”来看,元组的三个元素值,分别代表着“长度”“宽度”和“高度”,但由于我们的显示设备是二维的,所以三维数组的打印结果就不像二维数组的“行列”那么“直观”了。

那么会是什么样的呢?让我们设计一个三维数组看一下。

In [8]: data4 = [[ 1,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12]], [[13, 14, 15, 16], [17, 18, 19, 20], [21, 22, 23, 24]]
        arr4 = np.array(data4)
        arr4
Out[8]: array([[[ 1,  2,  3,  4],
        [ 5,  6,  7,  8],
        [ 9, 10, 11, 12]],

       [[13, 14, 15, 16],
        [17, 18, 19, 20],
        [21, 22, 23, 24]]])

In [9]: arr4.shape
Out[9]: (2, 3, 4)

 

从打印结果来看,虽然这是一个shape属性为(2, 3, 4)的数组,但这里的2、3、4并不是延续着二维数组的打印方式,分别代表着行、列和“高”(或者说“组”),反而分别代表着“组”“行”“列”。

这就是为什么刚才我们说,“行列”的这种直观打印方式,只对一维和二维数组有效,对于三维和三维以上的数组就不会那么直观了。

所以,要理解数组的shape形状,还是要从列表的层级数以及列表的元素个数去计算。

当然,在我们初学数组,或者说在数据分析中经常会用到的二维数组时,还是可以便捷直观地用行列进行表示,这与数组的shape属性并不冲突,反而可以更好地帮助我们认知和分析。

5、多维数组

对于四维以及更高维度的数组来说,其shape属性的含义也一样。元组的元素个数代表着数组的维度,元组的值代表着每一个维度的数据个数。

如果将多维数组打印出来的话,元组元素的值,从左到右依次代表着最外层列表个数、次外层列表个数,直至最内层。

由于多维数组的打印后的可读性不高,而且数据量非常大,所以很少会对多维数组进行整体的打印操作。更多地还是应用NumPy强大的数组计算能力,对数组进行数据处理。

至于多维数组值的读取,我们会在后面学习数组的切片。再往后,还会应用数组的属性,在Pandas中实现更为便捷高效的数组读取操作。

6、ndim属性

刚刚我们是通过计算数组shape属性的元组元素个数来判断数组的维度的。

当数组的维度较少时,这个方法没有什么问题,但当数组的维度很多的时候,我们就不能再通过计算元组的元素个数来判断数组的维度了,这时就需要一个新的数组属性出场了,这就是数组的ndim属性。

数组的ndim属性,也是与数组的“形状”有关的属性,它返回的是一个数值,代表着数组的维度数量。

这个属性非常容易理解,几维数组ndim属性就是几。

In [10]: arr1.ndim
Out[10]: 1

In [11]: arr2.ndim
Out[11]: 2

In [12]: arr3.ndim
Out[12]: 2

In [13]: arr4.ndim
Out[13]: 3

由于ndim属性非常容易使用,所以经常用于验证一个大型数组的维度。

7、size属性

数组的size属性也很容易理解,返回的就是数组的元素个数,也就是数组在各个维度上的元素个数的乘积。

In [14]: arr1.size
Out[14]: 6

In [15]: arr2.size
Out[15]: 12

In [16]: arr3.size
Out[16]: 18

In [17]: arr4.size
Out[17]: 24

以上就是我们对于数组shape属性的介绍,并详细说明了shape属性的含义,以及多维数组的表示方法。

下一篇,我们将会学习数组的另一个重要属性——dtype,

敬请关注。

 

图片

 


感谢阅读本文!如有任何问题,欢迎留言,一起交流讨论^_^

要阅读《手把手陪您学Python》——NumPy系列文章的其他篇目,请关注公众号点击菜单选择,或点击下方链接直达。

《手把手陪您学Python》46——NumPy介绍

《手把手陪您学Python》47——ndarray

《手把手陪您学Python》48——数组的生成方法1

 


 

《手把手陪您学Python》系列文章入门阶段的篇目已经全部完成。

为更加清晰地展示Python入门阶段的知识体系,整理了如下的鱼骨图,以方便大家查阅。

图片

如要阅读相应篇目的内容,请关注公众号点击菜单选择,或点击下方链接直达。

《手把手陪您学Python》1——为什么要学Python?

《手把手陪您学Python》2——Python的安装

《手把手陪您学Python》3——PyCharm的安装和配置

《手把手陪您学Python》4——Hello World!

《手把手陪您学Python》5——Jupyter Notebook

《手把手陪您学Python》6——字符串的标识

《手把手陪您学Python》7——字符串的索引

《手把手陪您学Python》8——字符串的切片

《手把手陪您学Python》9——字符串的运算

《手把手陪您学Python》10——字符串的函数

《手把手陪您学Python》11——字符串的格式化输出

《手把手陪您学Python》12——数字

《手把手陪您学Python》13——运算

《手把手陪您学Python》14——交互式输入

《手把手陪您学Python》15——判断语句if

《手把手陪您学Python》16——循环语句while

《手把手陪您学Python》17——循环的终止

《手把手陪您学Python》18——循环语句for

《手把手陪您学Python》19——第一阶段小结

《手把手陪您学Python》20——列表

《手把手陪您学Python》21——元组

《手把手陪您学Python》22——字典

《手把手陪您学Python》23——内置序列函数

《手把手陪您学Python》24——集合

《手把手陪您学Python》25——列表推导式

《手把手陪您学Python》26——自定义函数

《手把手陪您学Python》27——自定义函数的参数

《手把手陪您学Python》28——自定义函数的返回值

《手把手陪您学Python》29——匿名函数

《手把手陪您学Python》30——模块

《手把手陪您学Python》31——文件的打开

《手把手陪您学Python》32——文件的读取

《手把手陪您学Python》33——文件的关闭

《手把手陪您学Python》34——文件的写入

《手把手陪您学Python》35——数据的存储

《手把手陪您学Python》36——错误和异常处理

《手把手陪您学Python》37——程序的重构

《手把手陪您学Python》38——第二阶段小结

《手把手陪您学Python》39——面向对象

《手把手陪您学Python》40——类的定义、属性与实例化

《手把手陪您学Python》41——类的方法与实例方法

《手把手陪您学Python》42——类的魔法方法

《手把手陪您学Python》43——类的继承

《手把手陪您学Python》44——类的导入

《手把手陪您学Python》45——Python入门完结篇

For Fans:关注“亦说Python”公众号,回复“手49”,即可免费下载本篇文章所用示例语句。

亦说Python——Python爱好者的学习分享园地
  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Python中的数组大小可以通过不同的方法来求取。一个常见的方法是使用NumPy库中的函数来获取数组的大小。在引用中,使用了NumPy库中的random.randint函数生成了一个4行5列的二维数组A,以及一个1行5列的二维数组B。可以通过A.shape和B.shape属性分别获取到数组A和数组B的大小。具体代码如下: A.shape:(4, 5) B.shape:(1, 5) 另外,如果我们有一个普通的Python二维数组,如引用中的arr,可以使用len函数来获取该数组的大小。len(arr)将返回数组的行数,而len(arr)将返回数组的列数。对于arr,可以得到其大小为5行3列。 所以,根据上述介绍,Python数组的大小可以通过NumPy库中的shape属性或普通Python数组中的len函数来求取。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Python——“元组、列表、字典、数组和矩阵”的大小问题](https://blog.csdn.net/zenghaitao0128/article/details/78574131)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [python: 求数组的行列大小](https://blog.csdn.net/A_zhangpengjie/article/details/107685095)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [Python笔记.docx](https://download.csdn.net/download/bxy0806/88235414)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值