首页 > 编程笔记 > Python笔记

Numpy ndarray多维数组

在本章我们将正式走进 Numpy 数组的世界,在讲解过程中可能会设计到许多数学上概念,对于数学基础不扎实,或者已经遗忘的小伙伴要及时的查漏补缺,千万不要遇到不懂的概念就焦躁,或者不懂还要硬着头皮去读,这样是没有任何效果的,大家要有一个良好学习态度与心态。数据分析不是感性思维,它是逻辑思维与科学运算的产物,所以友情的提示大家,数学上的一些概念要及时的学习巩固。

1. 什么是ndarray多维数组?

1) 生成随机ndarray多维数组

ndarray 是 Numpy 中的多维数组,数组中的元素具有相同的类型,且可以被索引,它由两部分组成一个数据本身,也就是实际数据,另一个是描述属于的元数据;大家读到这里,就可能产生了疑惑,首先是多维数组,可能对这个概念有些模糊,还有就是 ndarray 与我们之前接触过的 Python 内建数据结构并不相同,对它的两部分组成更是蒙圈,不要紧,那么我们就先上一段代码,直接生成一个 ndarray 多维数组,如下所示:
#在 ipython中完成下面代码
In [1]: import numpy as np
In [2]: data=np.random.randn(2,3)
In [3]: data
Out[3]:
array([[-1.47441959,  0.3962004 , -0.71924289],
       [-2.49313992, -1.16219399,  0.74342602]])
In [4]: data*10
Out[4]:
array([[-14.74419592,   3.96200397,  -7.19242891],
       [-24.93139917, -11.62193989,   7.43426025]])
In [5]: data+data
Out[5]:
array([[-2.94883918,  0.79240079, -1.43848578],
       [-4.98627983, -2.32438798,  1.48685205]])

首先我们使用了as np的方式进行导入,这是官方推荐的导包方法,在后续若出现了以 as 的方式导包的情况就不再做说明了。然后使用了 Numpy 的 random.randn 方法随机生成了一个 2 行 3 列 的 2 维数组,若是 3 行 3 列的话,我们也可以把它叫做是矩阵。最后我们分别对 data 数组进行了 *10 和 +data 的操作,从结果老看,会感觉不可思议,这些操作直接对 data 的数据本身进行了操作。

提示:一维可以理解为由一系列点构成的线,二维可以是一个平面由长宽构成,三维就是一个空间概念了,比如长方体、正方体等,即由长宽高构成三维。

每一维用一个 [] 括起,不同维之间用 , 逗号间隔,最后总体再用 [] 括起来,最快验证自己创建的数组是否满足自己的维度需求的方式,就是看打印的结果中,最外面有几个 中括号,有几个 就是几维数组,如果让你随机生成一个三维数组,你会了吗?
#生成随机三维数组
In [11]: data=np.random.randn(4,2,3)
In [12]: data
Out[12]:
array([[[-1.08631143, -2.13156405, -0.24601211],
        [ 0.36618268,  0.85528583,  1.04413612]],

       [[-0.1501994 , -0.56584489, -0.21236547],
        [-0.43745068, -1.09316937,  0.05280093]],

       [[-0.06530559, -0.35711274,  0.21184572],
        [ 2.11948393,  0.88514508,  1.22061786]],

       [[ 0.45099358, -0.97586603,  0.06857976],
        [ 0.12879119,  1.28446636,  0.17388125]]])
可以简单这样理解,列表肯定是一维的,多个列表一行一行堆叠形成二维,多个这样的二维构成三维,以此类推可得更高维矩阵。我们可以使用 np.array() 方式创建一个多维数组,如下所示:
ln [1] import numpy as np
In [2]: array=np.array([[1,2,3],[5,6,7]])
In [3]: print(type(array),array,array.shape)
<class 'numpy.ndarray'> [[1 2 3],[5 6 7]] (2, 3)

2. ndarray数组对象的构成

那么在本节刚开始的时候,我们说过 ndarray 对象由两个部分组成,一个数据本身,另一个是数据的描述。数据本身通过上面的例子我们已经了解了,那么数据的描述又是怎么回事呢?

我相信仔细的小伙伴已经发现了 array.shape 这句代码,从打印的内容来看它对应的是 (2,3) 这一项,而这个元组恰恰表明的是 ndarray 数组的组成,即数组的维度构成。所以这里的描述指的就是 ndarray 数组的属性,不过这些属性并没有和数据本身放在一起,而是和数据分开存放。

数据本身与描述性元数据分开存放的目的:一方面提高了内存空间的使用效率,另一方面减少了对数据本身的访问频率,从而了提高性能。依然以 data 为例:
In [8]: data.shape #shape属性表明数组的维度结构
Out[8]: (2, 3)
In [9]: data.dtype #dtype属性表明数组中数据类型
Out[9]: dtype('float64')
In [10]: print(type(data),data,data.shape)
<class 'numpy.ndarray'> [[-1.47441959  0.3962004  -0.71924289]
[-2.49313992 -1.16219399  0.74342602]] (2, 3)
本节主要针对 ndarray 数组对象做了基本介绍,在下一节中,我们会讲解创建 ndarray 数组方法以及它的相关属性。

所有教程

优秀文章