理解NumPy数组和数组的不同创建方式

【摘要:Numpy操作的数据结构是数组,本课的重点是理解NumPy数组和数组的运算。】

数据分析用到的数学运算离不开数学运算库。数学运算库可以让我们摆脱诸如向量运算、矩阵运算、基本统计运算等复杂的数学运算,无需为这些复杂的数学运算编写运算代码,而是把精力用到数据分析过程中。

安装NumPy

NumPy是Python中科学计算的基础软件包,它提供了众多数学运算工具,这些数学运算工具包括:线性代数中的矩阵和向量运算、傅里叶变换、多维数组运算、数据统计运算以及丰富的数学函数库。

NumPy是Python语言的扩展库,若要使用NumPy库,需要在开发环境中安装NumPy库,在计算机上安装NumPy最简单的方法,是在操作系统的的shell窗口,输入下面的命令:

pip3 install numpy

NumPy数组

数组是有序数据的集合,其结构的最大特征就是通过有序编号固定集合内每个数据的位置,如下图所示:

有序编号被称为下标(或称为索引),被固定的每个数据被称为元素。数组内所包含元素的数据类型没有限制,可以是任意类型的数据。在NumPy中,数组元素为布布尔值、实数或复数。

NumPy数组也称为数组对象,它提供了多个属性和方法用于获取数组的信息,对数组进行运算,数组中的所有元素类型都是相同的,数组对象名是ndarray,别名是array。

可以有多种方式创建NumPy数组:

(1)使用NumPy的array函数从Python列表中创建数组,数组类型由列表中的数据类型确定;

(2)使用NumPy的zeros函数创建数组元素全部为0的数组,默认情况下数组元素的类型为float64;

(3)使用NumPy的ones函数创建数组元素全部为1的数组,默认情况下数组元素的类型为float64;

(4)使用NumPy的empty函数创建数组元素为随机内容的数组,随机内容取决于存储器的状态;

(5)使用NumPy的arange函数创建等间隔的数字数组。

使用NumPy的array函数创建数组

NumPy的array函数可以创建1维、2维、……、n维数组,array函数要求传入Python列表数据,传入Python列表数据的嵌套层次决定了创建数组的维数。下面给出了创建1维和2维数组的案例,更多维数组的创建与2维数组的创建类同。

 

创建1维数组

要创建1维数组,只需在array函数中传入单层列表数据即可。在程序中使用NumPy数学计算包,需要将NumPy包导入到程序中。

下面的代码创建了整数类型(int32)的1维数组,数组变量名称是dim1,np是numpy包的引用名称,传入到array函数的是单层列表。

>>> import numpy as np
>>> dim1 = np.array([12,19,20,22,66,89])
>>> dim1
array([12, 19, 20, 22, 66, 89])
>>>

 

创建2维数组

只要在array函数中传入两层嵌套的列表数据即可创建2维数组。下面的代码创建了浮点类型(float64)的2维数组。

>>> dim2 = np.array([[0.3,0.11,0.98],[0.56,0.99,0.12]])
>>> dim2
array([[0.3 , 0.11, 0.98],
       [0.56, 0.99, 0.12]])

使用NumPy的zeros、ones、empty函数创建数组

使用NumPy的zeros、ones、empty函数可以创建指定维数的数组,zeros函数用0填充所有的数组元素,ones函数用1填充所有的数组元素,empty函数用随机内容填充所有的数组元素。

创建1维数组

下面的代码分别使用zeros、ones、empty函数创建了a、b、c三个1维数组。a数组有3个元素,元素内容都为0,b数组有5个元素,元素内容都为1,c数组有3个元素,元素内容都为0(填充的元素内容机内容取决于存储器的状态)。

>>> import numpy as np
>>> a = np.zeros(3)
>>> a
array([0., 0., 0.])
>>> b = np.ones(5)
>>> b
array([1., 1., 1., 1., 1.])
>>> c = np.empty(3)
>>> c
array([0., 0., 0.])
>>>

 

创建2维或更多维数组

使用zeros、ones、empty函数创建2维或更多维数组时,需要传入Python元组数据,元组内的元素个数(元组长度)指定了数组的维度,元素的值指定了当前元素所在的数组维度所包含元素的个数。例如:使用元组(3,4)创建的a数组是2维数组,第1维有三个元素,第2维有4个元素;使用元组(3,2,4)创建的d数组是3维数组,第1维有3个元素,第2维有2个元素,第3维有4个元素。

>>> import numpy as np
>>> a = np.zeros((3,4))
>>> a
array([[0., 0., 0., 0.],
       [0., 0., 0., 0.],
       [0., 0., 0., 0.]])
>>> b = np.ones((2,3))
>>> b
array([[1., 1., 1.],
       [1., 1., 1.]])
>>> c = np.empty((2,1))
>>> c
array([[0.],
       [0.]])
>>> d = np.zeros((3,2,4))
>>> d
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.]]])
>>>

 

创建指定类型的数组

使用zeros、ones、empty函数可以创建指定数据类型的数组,zeros、ones、empty函数创建数组时,默认的数据类型是float64,如果需要创建其它数据类型的数组,可以在函数中指定数据类型。

下面的代码创建数据类型为complex的二维数组。

>>> import numpy as np
>>> a = np.zeros((3,4),dtype=complex)
>>> a
array([[0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j],
       [0.+0.j, 0.+0.j, 0.+0.j, 0.+0.j]])
>>>

使用NumPy的arange函数创建等间隔的数字数组

NumPy的arange函数可以创建等间隔的数字数组。arange函数需要传入3个参数,第一个参数是起始值,第二个参数是结束值,第三个参数指定了从起始值到结束值的间隔。例如起始值是1,结束值是10,间隔是2,则创建的数组元素为1、3、5、7、9。当第三个参数省略时,NumPy会选择数字1作为间隔数字。

下面的代码创建了count和index两个1维数组,count的间隔为1,index的间隔为2。

>>> count = np.arange(1,5)
>>> count
array([1, 2, 3, 4])
>>> index = np.arange(1,10,2)
>>> index
array([1, 3, 5, 7, 9])
>>>

NumPy数组对象的属性

NumPy的array数组对象提供了一些关键属性,可以输出数组的特性。下表给出了array数组对象的关键属性名称及作用。

序号 属性名称 作用
1 ndim int32类型,数组维度的数量
2 shape Python元组类型,存储每个维度数组的大小
3 size 数组元素的总数
4 dtype 数组元素的数据类型
5 itemsize 数组中每个元素的字节大小
6 data 包含数组元素的缓冲区,一般使用索引访问数组元素

 

下面的代码创建了2维数组a,第1维有2个元素,每个元素是一个数组,第2维有3个元素。数组的总元素个数为2*3=6,数组元素的数据类型是int32,每个字节的元素长度是4个字节。

>>> import numpy as np
>>> a = np.array([[2,3,6],[1,6,9]])
>>> a.ndim
2
>>> a.shape
(2, 3)
>>> a.size
6
>>> a.dtype
dtype('int32')
>>> a.itemsize
4
>>>