在《Python Numpy基础:多维数组ndarray对象》我们对 ndarray 数组对象有了基本的认识,ndarray 数组由数据本身以及描述性元数据构成,且分开存放,从而减少对数据本身的访问频率,进而优化了效率,ndarray 数组,也可以称为 Numpy 数组,该数组所有的数据类型必相同,即具有同质性;且数组的下标也是从 0 开始的。
在上一节中大多数情况下是生成的是随机数组但是这与我们的主观能动性不符,那么如何创建一个 Numpy 数组呢,在本节我们将介绍几种创建数组的方法。
这是最基本的数组构建方法, 它的完整方法如下所示:
对于上面的参数,我们简单做一下解释,因为某些参数几乎用不到,所以我们只需记住常用的重要参数即可:
示例如下所示:
In [1]: import numpy as np
In [2]: data=np.array([[1,2],[3,4]])
In [3]: data
Out[3]:
array([[1, 2],
[3, 4]])
In [4]: data=np.array([1,2,3,4],dtype=complex)#复数类型
In [5]: data
Out[5]: array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j])
In [6]: data=np.array([1,2,3,4],ndmin=2)#二维数组
In [7]: data
Out[7]: array([[1, 2, 3, 4]])
这个创建数组的方式也很容易理解,因为它和 Python 的内置函数的 range 函数是一样的,在以后我们会经常使用的到这个方法:
In [8]: data=np.arange(1,5,1)
In [9]: data
Out[9]: array([1, 2, 3, 4])
通过调用 ndarray 数组的属性 reshape 可以改变数组的维度。
这两种方法都可以创建全 0 数组,只不过后者可以参考某个 ndarry 数组的维度来创建全 0 数组,提供的参数含义如下所示:
shape:数组形状
dtype:数据类型
order: 表示数组在内存的存放次序是以行“C”为主,还是以列“F”为主,“A” 表示以列为主储存,一般默认即可。
示例如下:
In [1]: import numpy as np
In [2]: data=np.zeros(8)#一维数组含有8个元素
In [3]: data
Out[3]: array([0., 0., 0., 0., 0., 0., 0., 0.])
In [4]: data=np.zeros((3,3))#3*3的二维矩阵
In [5]: data
Out[5]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
In [6]: data1=np.zeros_like(data)#按照data的维度生成数组
In [7]: data1
Out[7]:
array([[0., 0., 0.],
[0., 0., 0.],
[0., 0., 0.]])
你可能会有疑问,这种创建数组的方式有什么作用呢?其实它的作用还是挺重要的,它的应用场景就是掩码操作,即 0 代表 False 而 1 代表 True,这在后面会给大家进行介绍。
这两个方法和上面的 zeros 方法很相似,只不过它生成的是全 1 数组,又称为单位矩阵,如下所示:
In [8]: data=np.ones(6)
In [9]: data
Out[9]: array([1., 1., 1., 1., 1., 1.])
In [10]: data=np.ones((2,4))
In [11]: data
Out[11]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
In [12]: data1=np.ones_like(data)
In [13]: data1
Out[13]:
array([[1., 1., 1., 1.],
[1., 1., 1., 1.]])
用于创建空数组,只不过它不是真“空”,它会提供未初始化的随机值,如果想创建高维数组则需要 shape 传递一个元组,示例如下所示:
In [1]: import numpy as np
In [2]: data=np.empty(5)
In [3]: data
Out[3]:
array([0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 6.36356552e-321,
2.64522281e+185])
In [4]: data=np.empty(shape=(3,3))
In [5]: data
Out[5]:
array([[6.23042070e-307, 1.42417221e-306, 1.37961641e-306],
[2.22522597e-306, 1.33511969e-306, 1.24610383e-306],
[1.51317517e-306, 9.34610469e-307, 2.56765117e-312]])
其中 e 是数学中一个超越数,是一个无限不循环小数。
np.eys() 函数定义如下所示,它可以用来创建对角矩阵数组,即 N*N 的二维矩阵,对角线为 1,其余为 0:
In [13]: data=np.eye(5)#5*5矩阵
In [14]: data
Out[14]:
array([[1., 0., 0., 0., 0.],
[0., 1., 0., 0., 0.],
[0., 0., 1., 0., 0.],
[0., 0., 0., 1., 0.],
[0., 0., 0., 0., 1.]])
In [15]: data=np.eye(4)#4*4矩阵
In [16]: data
Out[16]:
array([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])
生成指定范围内指定个数的一维数组,生成是一个等差数列,该方法的定义如下所示:
对该方法的参数解释如下所示:
在正态分布的数据关系中,该方法的使用频率很高,示例如下所示:
In [15]: data=np.linspace(2,6,num=10)
In [16]: data
Out[16]:
array([2. , 2.44444444, 2.88888889, 3.33333333, 3.77777778,
4.22222222, 4.66666667, 5.11111111, 5.55555556, 6. ])
In [17]: data=np.linspace(2,3,num=10)
In [18]: data
Out[18]:
array([2. , 2.11111111, 2.22222222, 2.33333333, 2.44444444,
2.55555556, 2.66666667, 2.77777778, 2.88888889, 3. ])
下面我们介绍 ndarray 数组的常用属性,其实在我们在前面知识介绍中已经涉及了一些,现在我们系统进行讲解,这里我们要理解几个专业名词,即维度、轴、秩,Numpy 中维度(dimensions)也称为轴(axis),而轴的个数称为秩。这些名词简单知道即可,不必深究。NumPy 的数组中有很多的属性,有一些属性可能在实例的工作中,可能万年不遇,所以我们只做针对性的介绍:
对于上面属性,我们只演示重要的一部分属性,大家可以自己尝试其他的属性,对于涉及到复数概念不清楚的,可以自行百度搜索,后面知识还会涉及到标量与向量的概念,所以大家要学会自学,这些简单的数学概念不会在教程中讲解。对象属性的操作示例如下:
In [1]: import numpy as np
In [2]: data=np.array([[1,2,3],[4,5,6]])
#获取维度
In [3]: data.shape
Out[3]: (2, 3)
#获取维数
In [4]: data.ndim
Out[4]: 2
#获取元素数据类型
In [5]: data.dtype
Out[5]: dtype('int32')
In [6]: data.size
Out[6]: 6
#每个元组字节大小
In [7]: data.itemsize
Out[7]: 4
#获取对象内存信息
In [8]: data.flags
Out[8]:
C_CONTIGUOUS : True # 数组位于单一的、C 风格的连续区段内
F_CONTIGUOUS : False #数组位于单一的、Fortran 风格的连续区段内
OWNDATA : True #数组的内存从其它对象处借用
WRITEABLE : True #数据区域可写入。 将它设置为False会锁定数据,使其只读
ALIGNED : True #数据和任何元素会为硬件适当对齐
WRITEBACKIFCOPY : False #
UPDATEIFCOPY : False #这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新
#获取转置数组
In [9]: data.T
Out[9]:
array([[1, 4],
[2, 5],
[3, 6]])
对于上面的常用属性大家要重点掌握,Numpy 数组的创建方法,也不止于此,我们还可以使用 np.logspace() 创建等比数组以及 np.full() 构造一个数组,用指定值填充其元素,对于本节知识大家也要重点掌握,作为 Numpy 的基础,尤为重要。