NumPy 多维数组-ndarray

NumPy 是将多维数组作为基本数据结构来进行操作的库。NumPy 中的唯一数据结构是 ndarray,而不是 Python 原生的列表,因为列表的操作速度很慢。

学习 NumPy 时,了解 ndarray 后可以更加清楚的知道为什么 NumPy 能够实现高速的运算,它是 NumPy 的重中之重。

ndarray 定义

ndarray是 n-dimension array 的缩写,也就是多维数组的意思,我们可以通过它的官网得到它的具体定义-一个 ndarray 是一个具有相同数据类型和形状的(通常固定形状)多维容器。维数和元素个数是通过形状(shape)来定义的,其中 shape 是一个有 N 个整数的元组,它代表了每个维度上元素的多少。在数组中的元素类型是通过 dtype-data-type object 来定义的。

我们来用通俗的语言把上面的话解释一遍就是 ndarray 存储在对象实例中的所有元素必须具有相同类型的数据类型以及尺寸。

ndarray 数据类型的特点归纳为以下几点,

  1. 只能存储相同类型的元素
  2. 每个维度上的数据数量必须一样,比如 2 维 ndarray 中各个列上的数据个数必须一样,当然各行也必须具有同样数量的数据
  3. 基于 C 语言,所以能最优化的执行矩阵运算

ndarray 属性

我们先列出 ndarray 的属性来,

属性 说明
T 转置矩阵。当数组为 1 维时,返回原始数组。
data 一个 Python 缓冲区对象,指向数组中数据的起始位置。
dtype ndarray 中包含的元素的数据类型。
flags 有关如何在内存中存储 ndarray 数据的信息(内存布局)。
flat 将 ndarray 转换为一维数组的迭代器。
imag ndarray 数据中的虚部
real ndarray 数据中的实部
size ndarray 中包含的元素数量。
itemsize 每个元素的大小(以字节为单位)。
nbytes 该 ndarray 占用的总内存(以字节为单位)。
ndim ndarray 中包含的维数。
shape ndarray 的形状(结果为元组)。
strides 移动到每个维度方向上的下一个相邻元素所需的字节数由元组表示。
ctypes 在 ctypes 模块中处理的迭代器。
base ndarray 所基于的对象(正在引用哪个内存)。

当你访问 ndarray 里面的属性时,ndarray 的内容是不会变的,假如当你用.T 来得到它的转置时,原始数据其实并没有改变,你得到的是一个全新的 ndarray

我们通过代码来看一下每个属性它具体的意义,

>>> import numpy as np
>>> a = np.array([1, 2, 3])

我们需要调用 numpy 库,然后新建一个一维数组。我们来看一下它的数据类型及元素的数据类型

>>> type(a)
numpy.ndarray
>>> a.dtype
dtype('int32')

我们再来新建一个二维数组,并看一下它的一些属性,

>>> b = np.array([[4, 5, 6], [7, 8, 9]])
>>> b
array([[4, 5, 6],
       [7, 8, 9]])
>>> b.T		# 求 b 的转置矩阵
array([[4, 7],
       [5, 8],
       [6, 9]])
>>> b		# 可以通过以下看出来,b 的数据和信息是没有变化的
array([[4, 5, 6],
       [7, 8, 9]])
>>> a.size	# a 里面有三个元素
3
>>> b.size	# b 里面有 6 个元素
6
>>> a.itemsize # a 元素数据里有几个字节长度,这里是 8 字节,因为数据类型是 int64
8
>>> b.nbytes  # b 数组一共有多少个字节,这里是 48, 6x8
48
>>> b.shape # b 的形状,2 行 3 列
(2, 3)
>>> b.dnim # b 的维数, 二维
2