Python / Numpy 的 ndarray 对象

Numpy 的 ndarray 对象

本小节将详述如何创建 ndarray 对象,以及如何创建特殊的 ndarray 对象。

1. ndarray 对象

ndarray,也就是我们常用的 N 维数组对象,是 Numpy 最核心的组成部分。你可以把它视为一个快速而灵活的大数据集容器,利用这种数组你可以便捷地执行一些数学运算。

ndarray 有两个显著特点:

  • ndarray 是一个通用的同构数据多维容器,也就是说,该容器中的每一个元素都必须是相同类型的,且每个元素在内存中都有相同存储大小的区域;
  • ndarray 具有矢量算术运算能力和复杂的广播能力,并具有执行速度快和节省空间的特点。

2. 创建 ndarray

2.1 numpy.array 函数

创建数组对象最简单的方法是利用 array 函数,该函数的输入为序列型对象,输出为一个含有传入数据的 Numpy 数组。 array 函数的常用调用参数如下:

numpy.array(object, dtype=None, copy=True, ndmin=0)
参数 说明
object array的主要输入参数,可以是数组、有序序列,或者是嵌套的序列
dtype 数据类型,用来指定生成的ndarray数据结构的元素类型
copy 对象是否被复制,默认为True
ndmin 指定返回数组的最小维数

Tips:关于数据类型相关知识,我们会在下个小节详细讲解。

案例

以列表转换为例:

import numpy as np

data0 = [1, 4, 3, 7, 2]
arr0 = np.array(data0)
arr0

这里通过 array 函数,输入列表,输出一个数组对象。

Out:
    array([1, 4, 3, 7, 2])

在上述案例中,并未指定dtype。这是因为在通常情况下,np.array函数会尝试为新建的数组推断出一个合理的数据类型:

arr0.dtype
Out:
    dtype('int32')

可以看到自动创建的数据类型为int32

案例

当然了,你可以在开始的时候,利用dtype参数,显式地指定数组元素的数据类型。这里我们以一个嵌套列表为例,进行说明:

data1 = [[1, 2, 3.2], [4, 5.1, 6], [7.3, 8, 9]]
arr1 = np.array(data1, dtype='float')
arr1

这里通过 array 函数,输入嵌套列表,并同时指定数据类型为 float,输出对应的数组对象。

Out:
    array([[1. , 2. , 3.2],
           [4. , 5.1, 6. ],
           [7.3, 8. , 9. ]])

查看数组对象的数据类型为float64。

arr1.dtype
Out:
    dtype('float64')

案例

也可以利用 ndmin 参数,手动指定创建数组的维数:

arr2 = np.array(data0, ndmin=2)
arr2
Out:
    array([[1, 4, 3, 7, 2]])

这里利用 ndmin 参数,手动创建了一个二维数组。

3. 常用的 ndarray 创建函数

np.array 之外,Numpy 内置了一些其他方法,可以快速创建一些具有特殊特征的数组。比如,利用 zeros 函数和 ones 函数可以创建一个指定大小的全 0 或全 1 的数组。

3.1 numpy.zeros 函数

zeros 函数可以创建一个指定大小的、以 0 来填充的数组。

案例

创建一个长度为 4 的全 0 数组:

np.zeros(4)
Out:
    array([0., 0., 0., 0.])

3.2 numpy.ones 函数

ones 函数可以创建一个指定大小的、以 1 来填充的数组。

案例

创建一个大小为 3×3 的全 0 数组方阵:

np.ones((3,3))
Out:
    array([[1., 1., 1.],
           [1., 1., 1.],
           [1., 1., 1.]])

需要注意的是,对于创建 2 维及以上的数组时,zeros函数和 ones 函数接收一个表示数组大小的元组 tuple 作为输入。

3.3 numpy.empty 函数

类似的,empty 函数用来创建一个指定大小的、没有具体值的数组。

案例

这里我们创建一个 3×2×3 的三维空数组:

np.empty((3,2,3))
Out:
    array([[[4.67296746e-307, 1.69121096e-306, 1.33511018e-306],
            [1.33511018e-306, 1.86917476e-306, 1.11256817e-306]],

           [[1.06811422e-306, 1.42417221e-306, 1.11260619e-306],
            [8.90094053e-307, 1.86919378e-306, 1.06809792e-306]],

           [[1.37962456e-306, 1.69111861e-306, 1.78020169e-306],
            [1.37961777e-306, 7.56599807e-307, 7.56599806e-307]]])

这里要注意一下 empty 函数的输出。因为 empty 考虑到输出全 0 数组是不安全的想法,因此很多情况下,它返回的是一些没有规律的垃圾值。

Numpy 还提供了创建单位方阵(对角线为 1,其余为 0)的方法:identity 和 eye。

3.4 numpy.identity 函数

identity 函数用来创建一个指定大小的单位矩阵(对角线为 1 的数组)。

案例

这里我们利用 identity 函数来创建一个大小为 3×3 的单位矩阵:

np.identity(3)
Out:
    array([[1., 0., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])

3.5 numpy.eye 函数

eye 函数用来创建一个指定大小的、对角线为 1 的数组。

eye 函数是 identity 的升级版本。eye 函数的原型如下:

np.eye(N, M=None, k=0, dtype=<typefloat>)

当 k 为默认值时,eye 函数可以创建大小为 N×M,主对角线为 1 的矩阵。

案例

创建一个大小为 3×4 的主对角线为 1 的数组。

np.eye(N=3, M=4)
Out:
    array([[1., 0., 0., 0.],
           [0., 1., 0., 0.],
           [0., 0., 1., 0.]])

案例

当 k、M 均为默认值时,eye 函数的功能和 identity 一致。

例如,利用 eye 函数创建一个大小为 3×3 的单位矩阵。

np.eye(N=3)
Out:
    array([[1., 0., 0.],
           [0., 1., 0.],
           [0., 0., 1.]])

k 表示为 1 的对角线的偏移量,当 k 大于 0 时,表示向右偏移。

例如,创建一个大小为 3×4 的数组,为 1 的对角线向右偏移一位:

np.eye(N=3, M=4, k=1)
Out:
    array([[0., 1., 0., 0.],
           [0., 0., 1., 0.],
           [0., 0., 0., 1.]])

4. 小结

本小节重点讲述了如何利用序列型对象,创建一个数组序列;以及如何创建常用的特殊数组,例如:全 0 数组、全 1 数组,全空数组、对角线为 1 的数组等。