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