NumPy - Ndarray 对象
NumPy ndarray
NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。它描述了相同类型的项的集合,可以使用从零开始的索引进行访问。
ndarray 中的每个项在内存中占用相同大小的块,并由名为 dtype 的数据类型对象表示。
从 ndarray 对象中提取的任何项(通过切片)都由数组标量类型的 Python 对象表示。
ndarray、dtype 和数组标量类型之间的关系
下图展示了 ndarray、数据类型对象 dtype 和数组标量类型之间的关系 -

创建 ndarray
ndarray 类的实例可以通过不同的数组构造创建例程。基本的 ndarray 是使用 NumPy 中的 array() 函数创建的。
numpy.array() 函数可以从任何公开数组接口的对象或任何返回数组的方法创建 ndarray。语法如下:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上述构造函数采用以下参数:
Sr.No. | Parameter &说明 |
---|---|
1 |
object 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 |
2 |
dtype 所需的数组数据类型,可选 |
3 |
copy 可选。默认情况下 (true),对象会被复制。 |
4 |
order C(行优先)或 F(列优先)或 A(任意)(默认) |
5 |
subok 默认情况下,返回的数组强制为基类数组。如果为 true,则子类将通过 |
6 |
ndmin 指定结果数组的最小维度 |
查看以下示例以更好地理解。
示例:创建一维数组
在下面的示例中,我们使用 NumPy 中的 array() 函数创建一个一维数组 -
import numpy as np a = np.array([1, 2, 3]) print(a)
输出结果如下 -
[1, 2, 3]
示例:创建多维数组
这里,我们使用 NumPy 中的 array() 函数创建一个二维数组 -
import numpy as np a = np.array([[1, 2], [3, 4]]) print(a)
结果如下 -
[[1 2] [3 4]]
示例:指定最小维度
现在,我们通过将"ndmin"作为参数传递给 array() 函数来指定结果数组的最小维度−
import numpy as np a = np.array([1, 2, 3, 4, 5], ndmin=2) print(a)
以下是上述代码的输出 −
[[1 2 3 4 5]]
示例:指定数据类型
在下面的示例中,我们在 array() 函数中将"dtype"参数设置为 complex −
import numpy as np a = np.array([1, 2, 3], dtype=complex) print(a)
执行上述代码后代码中,我们得到以下输出 -
[1.+0.j 2.+0.j 3.+0.j]
ndarray 的内存布局
ndarray 对象由连续的内存块组成。这意味着数组中的所有元素都存储在一个连续的内存段中。这种连续的内存布局可以轻松访问和操作数组元素。
索引方案
索引方案将 ndarray 中的每个项目映射到内存块中的特定位置。ndarray 使用形状和步幅的组合来确定每个元素的位置。
形状 - 数组的形状是一个整数元组,表示数组沿每个维度的大小。例如,2x3 数组的形状为 (2, 3)。
步幅 - 步幅是指遍历数组时在每个维度上移动的字节数。步幅决定了如何在每个维度上从一个元素移动到下一个元素。
行优先和列优先
ndarray 中的元素可以按两种主要顺序存储。它们是 -
行优先顺序(C 风格) - 在行优先顺序中,最后一个索引变化最快。这意味着同一行中的元素在内存中彼此相邻存储。NumPy 默认使用行优先顺序。例如,在一个 2x3 数组中 -
[[1, 2, 3], [4, 5, 6]]
元素在内存中的存储顺序为:1, 2, 3, 4, 5, 6。
列主序(FORTRAN 风格)- 在列主序中,第一个索引变化最快。这意味着同一列中的元素在内存中彼此相邻存储。例如,在一个 2x3 数组中 -
[[1, 2, 3], [4, 5, 6]]
元素在内存中的存储方式为:1, 4, 2, 5, 3, 6。
示例
以下是一个基本示例,用于演示内存布局的用法 -
import numpy as np # 按行优先顺序创建一个 2x3 数组 a = np.array([[1, 2, 3], [4, 5, 6]]) print("数组:") print(a) print("形状:", a.shape) print("步幅:", a.strides)
数组的形状为 (2, 3),表示它有 2 行 3 列。步幅为 (24, 8),这意味着要移动到下一行,我们需要跳过 24 个字节(因为每个元素都是 8 字节的整数,并且有 3 列);要移动到下一列,我们需要跳过 8 个字节(一个整数的大小),如下图所示 -
数组: [[1 2 3] [4 5 6]] 形状:(2, 3) 步幅:(24, 8)