NumPy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引。每个数组都有一个shape(表示各维度大小的元组)和一个dtype(用于说明数组数据类型的对象),如代码清单3-2所示。
代码运行结果如下:
创建ndarray对象只需调用NumPy的array函数即可:numpy.array(object, dtype=None,copy=True, order=None, subok=False, ndmin=0)。
各参数说明详见表3-1。
表3-1 创建ndarray对象的各参数说明
NumPy数组的维数称为秩(rank),秩就是轴的数量,一维数组的秩为1,二维数组的秩为2,依此类推。在NumPy中,每一个线性的数组称为一个轴(axis),即维度(dimension)。例如,二维数组相当于2个一维数组,其中第一个一维数组中每个元素又是1个一维数组。所以一维数组就是NumPy中的轴(axis),第一个轴相当于底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
很多时候可以声明axis。axis=0,表示沿着第0轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作(图3-1)。
图3-1 axis坐标参数示意图
NumPy数组中还有一些比较重要的ndarray对象,其属性见表3-2。
表3-2 NumPy数组重要ndarray对象属性
代码清单3-3为一个基本操作示例。
示例的代码中,np.arange函数用于创建等差数组,使用频率非常高,arange非常类似Python中的range函数,两者的区别仅在于arange返回的是一个数组,而range返回的是list。示例代码创建了一个从0到23的一维数组,可以写为np.arange(0, 24, 1),其中0为最小值,24为最大值(不包含),1为步长。使用reshape(行,列)函数对生成的等差一维数组进行重塑,得到一个三维数组。代码运行结果如下:
Ndarray数组除了可以使用底层Ndarray构造器来创建外,还可以通过以下方式。
1)用numpy.empty创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组,命令格式为: numpy . empty (shape, dtype =float, order = 'C' )。其中,shape为数组形状;dtype为数据类型;order指在计算机内存中存储元素的顺序,有C和F两个选项,分别代表行优先和列优先。
2)用numpy.zeros创建指定大小的数组,数组元素用0填充,命令格式为: numpy . zeros (shape, dtype =float, order = 'C' )。参数含义同numpy.empty。
3)用numpy.ones创建指定形状的数组,数组元素用1填充,命令格式为: numpy . ones (shape, dtype =float, order = 'C' )。参数含义同numpy.empty。
具体使用方法如代码清单3-4所示。
代码运行结果如下:
其中empty方法的数组元素为随机值,因为它们未初始化。
Ndarray数组还可以通过如下3种方法从其他数据类型转化而来。
1)用numpy.asarray将其他数据类型转换为ndarray,命令格式为: numpy . asarray (a,dtype= None , order= None )。其中,a为任意形式的输入参数,可以是列表、列表的元组、元组、元组的元组、元组的列表、多维数组;dtype为数据类型;order为在计算机内存中存储元素的顺序,有C和F两个选项,分别代表行优先和列优先。
2)用numpy.frombuffer实现动态数组,接受buffer输入参数,以流的形式读入转化成ndarray对象,命令格式为:numpy. frombuffer (buffer, dtype=float, count=- 1 , offset= 0 )。其中,buffer可以是任意对象,会以流的形式读入;dtype为返回数组的数据类型;count为读取的数据数量,默认为-1,读取所有数据;offset为读取的起始位置,默认为0。
3)用numpy.fromiter从可迭代对象中建立ndarray对象,返回一维数组,命令格式为: numpy . fromiter (iterable, dtype, count=- 1 )。其中,iterable是可迭代对象;dtype为返回数组的数据类型;count是读取的数据数量,默认为-1,读取所有数据。
从已有数组创建NumPy数组具体使用方法如代码清单3-5所示。
代码运行结果如下:
[1. 2. 3.]
[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']
[0. 1. 2. 3. 4.]
其中,frombuffer方法的参数buffer是字符串的时候,Python3默认“str”为Unicode类型,所以要转成bytestring需要在原“str”前加上“b”。
主要使用如下3种方法。
1)用numpy.arange创建数值范围并返回ndarray对象,命令格式为: numpy . arange (start,stop, step, dtype)。其中,start为起始值,默认为0;stop为终止值(不包含);step为步长,默认值为1;dtype返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。
2)用numpy.linspace创建一个一维数组,当数组是等差数列构成时,命令格式为: numpy . linspace (start, stop, num= 50 , endpoint= True , retstep= False , dtype= None )。其中,start为序列的起始值;stop为序列的终止值;num表示要生成的等步长样本数量,默认值为50;endpoint的值默认为True,且当endpoint为True时数列中包含stop值,否则不包含;retstep的值如果为True,生成的数组中会显示间距,否则不显示;dtype表示ndarray的数据类型。
3)用numpy.logspace创建一个等比数列,命令基本格式为: numpy . logspace (start, stop,num= 50 , endpoint= True , base= 10.0 , dtype= None )。其中,start为序列的起始值(base**start);stop为序列的终止值(base**stop);num为要生成的等步长的样本数量,默认值为50;endpoint的值默认为True,且当endpoint为True时,数列中包含stop值,否则不包含;base为对数log的底数;dtype表示ndarray对象的数据类型。
具体使用方法如代码清单3-6所示。
其中,arange方法的起始值为10,终止值为20,步长为2;linspace方法起始点为10,终止点为22,数列个数为6,不包含终止点;logspace方法将对数的底数设置为2,从0次幂开始,直到9次幂,共10个数值,代码运行结果如下:
Ndarray对象的内容可以通过索引或切片来访问和修改,与Python中list的切片操作一样。Ndarray数组可以基于0到N的下标进行索引,切片对象可以通过内置的slice函数,设置start、stop及step参数,从原数组中切割出一个新数组。使用方法如代码清单3-7所示。
在代码清单3-7中,首先通过arange函数创建ndarray对象。然后,设置切片的起始、终止和步长参数分别为2、10和2,也可以通过冒号分隔切片参数[start:stop:step]进行切片操作。如果只放置一个参数,为[2],表示将返回与该索引相对应的单个元素;为[2:],表示该索引开始以后的所有项都将被提取;如果使用2个参数,如[2:7],则提取2个索引(不包括停止索引)之间的项。多维数组同样适用上述索引提取方法,但要注意,维度之间使用逗号区分。代码运行结果如下: