资讯动态

MXNet 入门第一课:用 NP on MXNet 操作 ndarray 数据

发布时间:2026/9/20 9:50:21 来源:尧图企业网站定制
MXNet 入门第一课用 NP on MXNet 操作 ndarray 数据【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mx/mxnet本篇技术指南以 MXNet 官方入门教程《crash-course》第一步1-nparray.md为骨架系统讲解 MXNet 的 NumPy 风格前端——np与npx包——从数组创建、属性查询、数学运算、索引切片到与标准 NumPy 数组互转、跨设备拷贝的完整用法。读完本文你将能够直接使用 NumPy 的书写习惯在 MXNet 中完成张量操作并理解这些操作背后的NumPy 语义开关npx.set_np与源码级实现差异为后续搭建神经网络2-create-nn.md、使用自动微分3-autograd.md以及 GPU 加速7-use-gpus.md打下基础。一、什么是 NP on MXNetMXNet 的np包提供了对 ndarray多维数组的 NumPy 风格封装。它是在常见 NumPy ndarray 功能之上的扩展支持 GPUndarray 可以无缝地创建、计算在 GPU 设备上支持自动微分autograd为后续基于 Gluon 的深度学习训练提供求导基础API 与 NumPy 高度对齐大量 NumPy 方法在 MXNet 内直接可用从 NumPy 迁移成本低。np与 NumPy 扩展包npx共同组成了NP on MXNet 前端。其中npx不仅提供set_np等语义开关还提供npx.gpu等设备对象与额外的扩展算子。二、环境准备导入包并激活 NumPy 模式在正式开始前需要先执行以下命令导入np包与npx扩展包并激活 NumPy 风格模式import mxnet as mx from mxnet import np, npx npx.set_np() # Activate NumPy-like mode.npx.set_np()到底做了什么set_np是 NP on MXNet 的总开关实现在 python/mxnet/util.py它同时控制三个独立语义参数默认值作用shapeTrue是否启用 NumPy 形状语义。开启后零维如shape()与含零维度如shape(2, 0, 3)都是合法形状可在形状推导中正常通过而在旧模式下会被视为未知形状并报错arrayTrue是否启用 NumPy 数组语义。开启后Gluon 的Block会创建/产生mxnet.numpy.ndarray类型的参数与输出而非旧式的mx.nd.NDArraydtypeFalse是否启用 NumPy dtype 语义。True时默认 dtype 为float64False时默认 dtype 为float32从源码可以看出两个重要的约束与细节shape是array的前置条件当shapeFalse而arrayTrue时set_np会直接抛出ValueError: NumPy Shape semantics is required in using NumPy array semantics.因此官方强烈建议两个标志同时置True以完整启用 NumPy 行为array开关是线程级的它通过_set_np_arraypython/mxnet/util.py写入线程本地作用域_NumpyArrayScope即只影响当前线程并且首次激活时会打印一条 INFO 日志说明 NumPy 数组语义已开启。另外set_np内部还会调用set_np_default_dtype设置默认 dtype本教程采用的默认参数dtypeFalse下所有 ndarray 默认 dtype 为float32这是 MXNet 为深度学习训练专门设计的默认值——相比标准 NumPy 的float64能节省一半显存/内存并显著加速计算。三、创建数组从固定值、全 1 矩阵到随机采样3.1 从嵌套元组创建 2D 数组创建 2D 数组矩阵值来自两组整数 1、2、3 与 5、6、7即整数的元组的元组np.array(((1, 2, 3), (5, 6, 7)))输出为 2 行 3 列的矩阵。注意这里np.array的入参风格与 NumPy 完全一致可接受嵌套元组、嵌套列表等任意可迭代结构。3.2 用固定值填充np.full创建同样形状2 行 3 列但全部填充为 1 的矩阵x np.full((2, 3), 1) x3.3 全 1 数组np.ones也可以直接使用更语义化的创建例程x np.ones((2, 3)) xnp.ones等价于np.full(shape, 1)属于 NumPy 中常用的创建例程之一MXNet 的np包还提供zeros、eye、arange、linspace等对齐 NumPy 的创建函数。3.4 均匀随机采样np.random.uniform创建同样形状但值在-1到1之间均匀随机采样y np.random.uniform(-1, 1, (2, 3)) y这里使用的mxnet.numpy.random模块实现位于 python/mxnet/numpy/random.py基于 MXNet 的随机算子在 GPU 上也能高效运行且可通过mx.random.seed等接口控制随机性。四、查询数组属性shape、size 与 dtype与 NumPy 一样每个 ndarray 的维度信息通过.shape属性展示。此外还可以查询.size元素总数等于 shape 各分量之积.dtype存储值的数据类型。(x.shape, x.size, x.dtype)一个值得注意的差异使用np.random.uniform等随机生成函数时得到的是float32而非标准 NumPy 的float64。这正是上一节提到的 MXNet 默认 dtype 语义所致。4.1 显式指定 dtype创建 ndarray 时可以显式指定数据类型例如int8x np.full((2, 3), 1, dtypeint8) x.dtype而默认情况下不指定 dtype得到的是float32x np.full((2, 3), 1) x.dtype4.2 dtype 提升规则运算时取精度最高的类型当不同类型的数组混合运算时默认使用精度最高的数据类型x x.astype(int8) x.astype(int) x.astype(float32) x.dtypeint8与标准intPython 的int在 NumPy 语义下通常映射为int64相加后再与float32相加结果类型提升为float32。这与 NumPy 的 dtype 提升promotion规则一致由底层算子注册的类型转换规则驱动。从源码层面看astype方法定义在 python/mxnet/numpy/multiarray.py参数签名对齐 NumPyastype(dtype, orderK, castingunsafe, subokTrue, copyTrue)但实现上有明确限制order仅支持K与Ccasting仅支持unsafesubok仅支持True传其他值会抛ValueErrordtype为None时默认转成float32当copyFalse且目标 dtype 与当前相同会直接返回自身而不拷贝实际转换通过_npi.cast(self, dtypedtype)调用底层 C 算子完成。五、数组运算逐元素运算、矩阵乘法与聚合ndarray 支持大量标准数学运算这里演示最常见的几类。5.1 逐元素乘法x * y运算符*被重载为逐元素相乘对应np.multiply而非矩阵乘法这与 NumPy 语义完全一致。5.2 指数运算np.exp(y)np.exp为逐元素指数函数此外sin、cos、log、sqrt等一元数学函数同样可用。5.3 转置与矩阵乘法先对y转置再计算矩阵-矩阵乘积np.dot(x, y.T)也可以使用语义更明确的矩阵乘法函数np.matmul(x, y.T)两种方式均支持 GPU 加速。从实现上看ndarray.dotpython/mxnet/numpy/multiarray.py与顶层mxnet.numpy.dot同文件 L12708都会分派到 MXNet 底层的高性能矩阵乘算子CPU 上可走 OpenBLAS/MKLGPU 上走 cuBLAS。5.4 聚合运算求和与均值利用内置算子求和x.sum()求均值x.mean()这两个方法定义于 python/mxnet/numpy/multiarray.py签名均为(axisNone, dtypeNone, outNone, keepdimsFalse)支持沿指定轴聚合、指定输出 dtype 与是否保持维度。除此之外max、min、std、var、prod、cumsum等聚合方法也都齐备。5.5 展平与重塑与 NumPy 一样可以执行 flatten 与 reshapex.flatten()x.reshape(6, 1)这里有一个易被忽略的语义差异值得注意flatten在 python/mxnet/numpy/multiarray.py 中实现为self.reshape(-1, orderorder)即返回的是数据的拷贝新分配内存而reshape返回的则可能与原数组共享底层存储视图语义修改重塑结果可能影响原数组。设计深度学习数据流时需要注意这一拷贝/视图差异。六、索引与切片读取、写入与多维切片ndarray 支持多种切片方式访问数据。6.1 读取单个元素读取特定元素y[1, 2]y[1, 2]在 NumPy 数组语义下返回的是一个形状为(1,)的一维数组而非标量。6.2 按列切片读取y的第 2、3 列列索引 1 到 3左闭右开y[:, 1:3]6.3 切片写入给指定切片区域写入标量y[:, 1:3] 2 y标量2会被广播broadcast到整个切片区域。6.4 多维切片同时限制行与列范围并写入y[1:2, 0:2] 4 y多维切片遵循 NumPy 的start:stop:step规则支持负索引、步长切片如y[::2]、省略号...等高级索引方式。七、与标准 NumPy 数组互转及设备迁移7.1 MXNet ndarray → NumPy ndarray通过asnumpy()将 MXNet ndarray 转为标准 NumPy 数组a x.asnumpy() (type(a), a)转换后返回的是标准numpy.ndarray。转换前后两个数组不共享内存——asnumpy是一次显式的同步拷贝。从源码看其实现位于 python/mxnet/ndarray/ndarray.py先分配np.empty(self.shape, dtypeself.dtype)再通过 C APIMXNDArraySyncCopyToCPU将数据同步拷回 CPU 内存若数组是bfloat16类型则先转成float32再拷贝。7.2 NumPy ndarray → MXNet ndarray用np.array把 NumPy 数组再封装回 MXNet ndarraya np.array(a) (type(a), a)同样是一次拷贝不会与传入的 NumPy 数组共享内存。7.3 迁移到 GPU 设备MXNet ndarray 的另一个核心能力是跨设备拷贝。可以将数组移动到不同的 GPU 设备上本教程只做演示深入内容见 7-use-gpus.mda.copyto(mx.gpu(0))copyto的完整实现定义于 python/mxnet/numpy/multiarray.py其行为分两种情况目标为另一个 ndarray要求other.shape与self.shape一致调用底层_npi.copyto(self, outother)完成拷贝返回值与other指向同一对象若源与目标是同一个 handle会发出RuntimeWarning提示尝试拷贝数组到自身目标为设备Device通过_new_alloc_handle在目标设备上新建一个形状、dtype 相同的 ndarray再执行拷贝返回新数组。注意copyto只接受ndarray或Device两种目标其他类型会抛出TypeError。这也意味着进行 GPU 拷贝时需要确保环境中有可用的 GPU 设备如mx.gpu(0)对应的 CUDA 设备。八、下一步向深度学习迈进ndarray 还有两项支撑深度学习的关键特性将在后续教程深入展开自动微分autogradndarray 可以记录计算图并自动求导是训练神经网络的基础GPU 加速ndarray 可在 GPU 上创建与运算大幅提升训练效率。在深入这些特性之前建议先进入入门系列的下一课学习如何用 Gluon 抽象层构建神经网络层Step 2: Create a neural network。整个 crash-course 系列位于 docs/python_docs/python/tutorials/getting-started/crash-course 目录包含从数组操作1-nparray.md、网络构建2-create-nn.md、自动微分3-autograd.md、网络组件4-components.md、数据集5-datasets.md、模型训练6-train-nn.md到 GPU 使用7-use-gpus.md的完整学习路径。九、小结与速查表本教程的核心要点汇总如下主题关键 API / 属性备注激活 NumPy 模式npx.set_np()可选参数shape/array/dtype默认 dtype 为float32创建数组np.array、np.full、np.ones、np.random.uniform随机默认float32属性查询.shape、.size、.dtypesize shape 分量之积类型转换.astype(dtype)仅支持orderK/C、castingunsafe运算时按精度最高类型提升数学运算*、np.exp、np.dot、np.matmul、.sum()、.mean()逐元素/矩阵乘/聚合形状操作.flatten()、.reshape()flatten返回拷贝reshape可能共享存储索引切片y[1, 2]、y[:, 1:3]、切片赋值遵循 NumPy 左闭右开与广播规则与 NumPy 互转.asnumpy()、np.array(...)均为拷贝不共享内存设备迁移.copyto(mx.gpu(0))目标可为 ndarray 或 Device把上述代码片段按顺序在 Jupyter Notebook 或 Python REPL 中执行即可完整跑通 MXNet 的第一步数据操作。在此基础上继续 crash-course 系列即可从数据操作平滑过渡到神经网络构建与训练。【免费下载链接】mxnetLightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Scala, Go, Javascript and more项目地址: https://gitcode.com/gh_mirrors/mx/mxnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价