任务2.1 掌握NumPy数组对象ndarray
2.1.1 创建数组对象
NumPy提供了两种基本的对象。
- ndarray(N-dimensional Array Object):存储单一数据类型的多维数组。
- ufunc(Universal Function Object):能够对数组进行处理的函数
(1)数组属性
在创建数组之前,需要先了解数组的基本属性,数组的属性及其说明如下表。
(2)数组创建
1.NumPy提供的array函数可以创建一维或多维数组,其基本使用格式如下。
numpy.array(object, dtype=None, *, copy=True, order='K', subok=False, ndmin=0, like=None)
array函数主要参数及其说明如下表。
2.除了使用array函数创建数组之外,还可以使用arange函数创建数组。arange函数类似于Python自带的函数range,通过指定开始值、终值和步长来创建一维数组,创建的数组不含终值。arange函数的基本使用格式如下。
numpy.arange([start, ]stop, [step, ]dtype=None, *, like=None)
arange函数常用参数及其说明如下表。
代码 2-3 使用arange函数创建数组
3.linspace函数通过指定开始值、终值和元素个数来创建一维数组,默认设置包括终值,这一点需要和arange函数区分。linspace函数的基本使用格式如下。
numpy.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None, axis=0)
linspace函数的常用参数及其说明如下表。
4.logspace函数和linspace函数类似,它创建的是等比数列。logspace函数的基本使用格式如下。
numpy.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None, axis=0)
在logspace函数的参数中,除了base参数和linspace函数的retstep参数不同之外,其余均相同。
NumPy还提供了其他函数用于创建特殊数组,如zeros、eye、diag和ones函数等。
zeros函数:用于创建值全部为0的数组,即创建的数组值全部填充为0。
eye函数:用于生成主对角线上的元素为1,其他的元素为0的数组,类似单位矩阵。
diag函数:创建类似对角的数组,即除对角线外的其他元素都为0,对角线上的元素可以是0或其他值。
ones函数:用于创建元素全部为1的数组,即创建的数组元素全部填充为1。
(3)数组数据类型
1.在实际的业务数据处理中,为了更准确地计算结果,需要使用不同精度的数据类型。
2.NumPy极大程度地扩充了原生Python的数据类型。
3.在NumPy中,所有数组的数据类型是同质的,即数组中的所有元素类型必须是一致的。
4.将元素类型保持一致可以更容易确定该数组所需要的存储空间。
下面将创建一个用于存储餐饮企业库存信息的数据 类型。其中,用一个能存储40个字符的字符串来记录商品的名称,用一个64位的整数来记 录商品的库存数量,最后用一个64位的单精度浮点数来记录商品的价格,具体步骤如下
2.1.2 生成随机数
手动创建数组往往很难达到数量要求,NumPy提供了强大的生成随机数的功能。然而,真正的随机数很难获得,在实际中使用的都是伪随机数。在大部分情况下,伪随机数就能满足获取的需求。当然,某些特殊情况除外,如进行高精度的模拟实验。 对于NumPy,与随机数相关的函数都在random模块中,其中包括了可以生成服从多种概率分布随机数的函数。
random函数是最常见的生成随机数的方法,random函数的基本使用格式如下。
numpy.random.random(size=None)
参数size接收int,表示返回的随机浮点数大小,默认为None。
rand()函数
rand函数可以生成服从均匀分布的随机数,其使用格式如下。
numpy.random.rand(d0, d1, ..., dn)
参数d0, d1, ..., dn接收int,表示返回数组的维度必须是非负数。如果没有给出参数,那么返回单个Python浮点数,无默认值。
randn函数可以生成服从正态分布的随机数,randn函数的使用格式和参数说明与rand函数相同。
randint()函数
randint函数可以生成给定上下限范围的随机数,其基本使用格式如下。
numpy.random.randint(low, high=None, size=None, dtype=int)
randint函数的常用参数及其说明如下表。
在random模块中,其他常用于生成随机数的函数如下表。
2.1.3 通过索引访问数组
NumPy通常以提供高效率的数组著称,这主要归功于索引的易用性。
1. 一维数组的索引
一维数组的方法很简单,与Python中的list的索引方法一致。
2. 多维数组的索引
多维数组的每一个维度都有一个索引,各个维度的索引之间用逗号隔开。
多维数组同样也可以使用整数序列和布尔值索引进行访问。
多维数组也可以使用整数序列索引和布尔值索引进行访问,如下代码2-20

2.1.4 变换数组的形态
在NumPy中,常用reshape函数改变数组的“形状”,即改变数组的维度。reshape函数的基本使用格式如下。
numpy.reshape(a, newshape, order='C')
reshape函数在改变原始数据的形状的同时不改变原始数据的值。如果指定的维度和数组的元素数目不吻合,那么函数将抛出异常。
reshape函数的常用参数及其说明如下表。
ravel( )函数
在NumPy中,可以使用ravel函数完成数组展平工作。
flatten( )函数
flatten函数也可以完成数组展平工作。与ravel函数的区别在于,flatten函数可以选择横向或纵向展平。
hstack( )函数
除了可以改变数组“形状”外,NumPy也可以对数组进行组合。组合主要有横向组合与纵向组合。使用hstack函数、vstack函数和concatenate函数可完成数组的组合。
横向组合是将ndarray对象构成的元组作为参数,传给hstack函数。
vstack( )函数
纵向组合同样是将ndarray对象构成的元组作为参数,传给vstack函数。
concatenate( )函数
concatenate函数也可以实现数组的横向组合和纵向组合,其中当参数axis=1时,数组按照横向组合,当参数axis=0时,数组按照纵向组合。
除了对数组进行横向和纵向的组合之外,还可以对数组进行分割。NumPy提供了hsplit、vsplit、dsplit和split函数,可以将数组分割成相同大小的子数组,也可以指定原数组中需要分割的位置。
hsplit()函数
可以对数组进行横向分割,以ndarray对象构成的元组作为参数
vsplit()函数
可以对数组进行纵向分割,以ndarray对象构成的元组作为参数。
split()函数
同样可以实现数组分割。当参数axis=1时,可以对数组进行横向分割;当参数axis=0时,可以对数组进行纵向分割。