- NumPy 教程
- NumPy - 首页
- NumPy - 简介
- NumPy - 环境
- NumPy 数组
- NumPy - Ndarray 对象
- NumPy - 数据类型
- NumPy 创建和操作数组
- NumPy - 数组创建例程
- NumPy - 数组操作
- NumPy - 从现有数据创建数组
- NumPy - 从数值范围创建数组
- NumPy - 遍历数组
- NumPy - 重塑数组
- NumPy - 连接数组
- NumPy - 堆叠数组
- NumPy - 分割数组
- NumPy - 展平数组
- NumPy - 转置数组
- NumPy 索引和切片
- NumPy - 索引和切片
- NumPy - 高级索引
- NumPy 数组属性和操作
- NumPy - 数组属性
- NumPy - 数组形状
- NumPy - 数组大小
- NumPy - 数组步长
- NumPy - 数组元素大小
- NumPy - 广播
- NumPy - 算术运算
- NumPy - 数组加法
- NumPy - 数组减法
- NumPy - 数组乘法
- NumPy - 数组除法
- NumPy 高级数组操作
- NumPy - 交换数组的轴
- NumPy - 字节交换
- NumPy - 副本和视图
- NumPy - 元素级数组比较
- NumPy - 过滤数组
- NumPy - 连接数组
- NumPy - 排序、搜索和计数函数
- NumPy - 搜索数组
- NumPy - 数组的并集
- NumPy - 查找唯一行
- NumPy - 创建日期时间数组
- NumPy - 二元运算符
- NumPy - 字符串函数
- NumPy - 数学函数
- NumPy - 统计函数
- NumPy - 矩阵库
- NumPy - 线性代数
- NumPy - Matplotlib
- NumPy - 使用 Matplotlib 绘制直方图
- NumPy - NumPy 的 I/O 操作
- NumPy 排序和高级操作
- NumPy - 排序数组
- NumPy - 沿轴排序
- NumPy - 使用花式索引排序
- NumPy - 结构化数组
- NumPy - 创建结构化数组
- NumPy - 操作结构化数组
- NumPy - 字段访问
- NumPy - 记录数组
- Numpy - 加载数组
- Numpy - 保存数组
- NumPy - 向数组追加值
- NumPy - 交换数组的列
- NumPy - 向数组插入轴
- NumPy 处理缺失数据
- NumPy - 处理缺失数据
- NumPy - 识别缺失值
- NumPy - 删除缺失数据
- NumPy - 填充缺失数据
- NumPy 性能优化
- NumPy - 使用数组进行性能优化
- NumPy - 使用数组进行矢量化
- NumPy - 数组的内存布局
- Numpy 线性代数
- NumPy - 线性代数
- NumPy - 矩阵库
- NumPy - 矩阵加法
- NumPy - 矩阵减法
- NumPy - 矩阵乘法
- NumPy - 元素级矩阵运算
- NumPy - 点积
- NumPy - 矩阵求逆
- NumPy - 行列式计算
- NumPy - 特征值
- NumPy - 特征向量
- NumPy - 奇异值分解
- NumPy - 求解线性方程组
- NumPy - 矩阵范数
- NumPy 元素级矩阵运算
- NumPy - 求和
- NumPy - 求平均值
- NumPy - 求中位数
- NumPy - 求最小值
- NumPy - 求最大值
- NumPy 集合运算
- NumPy - 唯一元素
- NumPy - 交集
- NumPy - 并集
- NumPy - 差集
- NumPy 有用资源
- NumPy 编译器
- NumPy - 快速指南
- NumPy - 有用资源
- NumPy - 讨论
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)
上述构造函数采用以下参数:
序号 | 参数和描述 |
---|---|
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 # Creating a 2x3 array in row-major order a = np.array([[1, 2, 3], [4, 5, 6]]) print("Array:") print(a) print("Shape:", a.shape) print("Strides:", a.strides)
数组的形状为 (2, 3),表示它有 2 行 3 列。步长为 (24, 8),这意味着要移动到下一行,我们需要跳过 24 个字节(因为每个元素都是一个 8 字节整数,并且有 3 列),要移动到下一列,我们需要跳过 8 个字节(一个整数的大小),如以下输出所示:
Array: [[1 2 3] [4 5 6]] Shape: (2, 3) Strides: (24, 8)