首页 > NumPy 阅读数:71

NumPy数组的创建与使用

NumPy 提供了两种基本对象:ndarray(N-dimensional Array Object)和 ufunc(Universal Function)。其中,ndarray 是一个多维数组对象,该对象由两个部分组成,即实际的数据和描述这些数据的元数据。大部分的数组操作仅仅修改元数据部分,而不改变底层的实际数据。而 ufunc 则是能够对数组进行处理的函数。

NumPy 数组一般是同质的(但特殊的数组类型可以是异质的),即数组中所有元素的数据类型必须一致,这样做的好处是,更容易确定该数组所需要的存储空间。与 Python 相同,NumPy 数组的下标也是从 0 开始的。

数组元素的数据类型用数据类型对象表示,数据类型对象是 numpy.dtype 类的实例。数据类型对象可以给出单个数组元素在内存中占用的字节数,即 dtype 类的 itemsize 属性,如 arr.dtype.itemsize,其中 arr 表示数组。

NumPy 创建数组对象

利用 NumPy 提供的 array() 函数可以创建一维或多维数组,其基本语法格式如下:
numpy.array(object,dtype=None,copy=True,order=None,subok=False,ndmin = 0)
函数中的参数说明如下:
  • object:接收 array,表示想要创建数组,无默认;
  • dtype:接收 data-type,表示数组所需要的数据类型,如果未给定,则选择保存对象所需的最小类型。默认为 None;
  • ndmin:接收 int,指定生成数组应该具有的最小维数,默认为 None。

在创建数组时,object 是唯一必要的参数,其余参数均为默认的可选参数。创建数组的示例代码 example1 如下。
# -*- coding: UTF-8 -*-
import numpy as np
arr1 =np.array([1,2,3,4])                   #创建一维数组
print('一维数组:',arr1)
arr2 = np.array([[1,2,3],[4,5,6]])          #创建二维数组
print('二维数组:',arr2)
arr3 =np.array([1,2,3,4],ndmin=3)           #设置最小维度3
print('三维数组:',arr3)
arr4 = np.array([1,2,3.4], dtype=complex)   #指定数据类型dtype为复数
print('复数数组:',arr4)

NumPy 选取数组元素

创建数组后,选取数组中的某个特定元素的方法如下:

数组名[m,n]

其中 m 和 n 为数组元素下标。需注意的是,数组的下标是从 0 开始的。

例如,在example1 示例中创建了一个二维数组 arr2,在创建 arr2 二维数组时,给 array() 函数传递的对象是一个嵌套的列表“[[1,2,3],[4,5,6]]”。那么,arr2 数组元素及与其对应的位置见表 1、表 2.

表 1:arr2 数组元素
1 2 3
4 5 6

表 2:arr2 数组元素对应的位置
arr2[0,0] arr2[0,1] arr2[0,2]
arr2[1,0] arr2[1,1] arr2[1,0]

NumPy 数组的属性

在对数组的操作中,常常需要了解数组的特性,如数组的维度、数据类型和数组中元素个数等。而要了解数组的特性,首先需要了解数组的属性。数组的属性及说明如表 3 所示。

表 3:数组的属性及说明
属性 说明
ndim 返回 int,表示数组维度
shape 返回 tuple,表示数组的尺寸,对于 n 行 m 列的矩阵,形状为(n,m)
size 返回 int,表述数组的元素总数,等于数组形状的乘积
dtype 返回 data-type,描述数组中元素的类型
itemsize
返回 int。表示数组的每个元素的大小(以字节为单位)。例如,一个元素类型为力 float64 的数组的 itemsize 属性值为 8 ( float64 占用 64bits,每个字节长度为 8,所以共占用 8 个字节,(64/8))。
又如,一个元素类型为 complex32 的数组的 itemsiz e属性值为4 (32/8)

说明:数组的 shape 属性不仅能显示数组的行数或列数,而且还可以调整数组的行和列的大小。

数组属性的应用示例代码 example2 如下。
# -*- coding: UTF-8 -*-
import numpy as np
#创建二维数组
arr1 = np.array([[1,2,3],[4,5,6]])
print('数组维度:',arr1.ndim)
print('数组形状:',arr1.shape)
print('数组的元素总数:',arr1.size)
print('数组元素的数据类型:',arr1.dtype)
print('数组中每个元素的大小:',arr1.itemsize)
#shape属性应用,将arr1由原2行3列数组调整为3行2列数组
arr1.shape = (3,2)
print('数组',arr1)
#利用dtype属性指定数据类型
arr3 = np.array([1,2,3,4], dtype = np.float32)
print('数组元素的数据类型',arr3.dtype)

NumPy 创建数组的其他方法

上面所介绍的创建数组的方法是先创建一个 Python 序列,然后再通过 array() 函数将其转换为数组,这样做显然效率不高,因此 NumPy 提供了许多专门用来创建数组的函数。

1. 使用 arange() 函数创建一维数组

arrange() 函数类似于 Python 自带的函数 range(),通过指定起始值、终止值和步长来创建一维数组,但是该函数所创建的数组中不包含终止值。

例如 numpy.arange(0,10,2),表示起始值 0,终止值 10,步长 2,创建一维数组 [0.2.4.6.8]。numpy.arange(3),表示起始值 0,终止值 3,步长 1,创建一维数组 [0.1.2]。

2. 使用 linspace() 函数创建数组

linspace() 函数是通过指定起始值、终止值和元素个数来创建一个等差数列的一维数组,默认设置包括终止值。如果在该函数中设置参数 endpoint=0,则创建的一维数组不包含终止值。该函数创建的数组元素的数据格式是浮点型。

注意:该函数指定了范围之间的均匀间隔数量,而不是步长。

例如,numpy.linspace(0,20,6),创建一维数组 [0.4.8.12.16.20]。

观察 numpy.linspace(0,20,6,endpoint=0)输出结果。

3. 使用 logspace() 函数创建数组

logspace() 函数和 linspace() 函数类似,但 logspace() 函数的起始值和终止值代表的是 10 的幂(默认基数为 10),如果要修改基数,可设置参数 base。

例如,numpy.logspace(0,20,20) 的第 1 个起始值参数 0 代表 10 的 0 次方,第 2 个终止值参数 20 代表 10 的 20 次方,第 3 个表示元素个数参数为 20。创建等比数列的一维数组为 [1.000000000e+001.12883789e+01 1.27427499e+02 1.43844989e+03 … 1.00000000e+ 20],其中…表示中间省略一些数据。

4. 使用 zeros()、eye()、identity()、diag() 和 ones() 函数创建特殊数组

使用 zeros() 函数创建值全部为 0 的数组,即创建的数组值全部填充为 0。例如 numpy.zeros((1,3)),创建数组 [[0. 0. 0.]],数组值全部为 0。

eye() 函数和 identity() 函数用来生成主对角线上的元素为 1,其他元素为 0 的数组,类似于单位矩阵。例如 numpy.eye(3),所创建的数组如下:

[[1. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]


diag() 函数创建类似对角的数组,即除对角线以外的其他元素都为 0,对角线上的元素可以是 0 或其他值。例如 numpy.diag((1,2,3)),所创建的数组如下:

[[1 0 0]
 [0 2 0]
 [0 0 3]]


ones() 函数用来创建元素全部为1的数组,即创建的数组元素全部填充为 1。例如 numpy.ones((3,3)),所创建的数组如下:

[[1. 1. 1.]
 [1. 1. 1.]
 [1. 1. 1.]]

5. 使用 asarray() 函数创建数组

asarray() 函数类似于 numpy.array,该函数可用于将 Python 序列转换为 ndarray。例如 numpy.asarray([(1,2,3),(4,5,6)]),所创建的数组如下:

[[1 2 3]
 [4 5 6]]

6. 使用 empty() 函数创建数组

empty() 函数创建指定形状和只分配内存空间的数组,而数组中的所有元素都未初始化。例如 numpy.empty((2, 3)) 表示创建 2 行 3 列的二维数组,但是数组中的所有元素都未初始化。

注意:zeros()、eye()、identity()、ones()、asarray() 和 empty() 函数第一个参数 shape 表示数组的形状,第二个参数 dtype 是指定数组元素的数据类型。