在上一篇《手把手陪您学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 数组获取指定元素 python获取数组的属性_python

 


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