完全指南:从零、全一、数值区间到矩阵构建)
MXNet NumPy 数组创建例程Array Creation Routines完全指南从零、全一、数值区间到矩阵构建【免费下载链接】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/mxne/mxnet导读mxnet.numpynp是 MXNet 深度学习中面向 NumPy 兼容风格的编程入口而数组创建例程Array Creation Routines是所有后续张量运算的起点。本文以官方 API 文档 routines.array-creation.rst 为主线完整覆盖零/一/填充/单位数组、从既有数据构造、数值区间、矩阵构建四大类共 30 余个函数并结合 python/mxnet/numpy/multiarray.py 的源码实现讲清每个函数的参数语义、默认值与 MXNet 特有的device支持。读完本文你将能像使用 NumPy 一样熟练地创建任意形状、任意设备CPU/GPU上的 MXNet 张量并准确理解其与官方 NumPy 在默认 dtype、内存布局上的差异。一、为什么需要一套“数组创建例程”在 MXNet 2.x 中mxnet.numpy以模块别名np提供与 NumPy 高度一致的 API例如import mxnet.numpy as np让熟悉 NumPy 的开发者可以零成本迁移同时又针对深度学习做了三点关键调整默认 dtype 面向深度学习官方 NumPy 默认浮点类型是float64而 MXNet 默认是float32深度学习的主流精度新增device参数几乎每个创建函数都支持device可直接把张量分配在 GPU 上内存布局仅支持 C 序order参数目前只接受C行主序。文档按用途把创建例程划分为五个大类见 routines.array-creation.rst分类已实现autosummary参考 NumPycode块Ones and zeros全零全一eyeemptyfullidentityonesones_likezeroszeros_likefull_likeempty_likeFrom existing data从既有数据arraycopyfrombufferfromfunctionfromiterfromstringloadtxtNumerical ranges数值区间arangelinspacelogspacemeshgridgeomspacemgridogridBuilding matrices构建矩阵trildiagdiagflattritriuvander记录数组 / 字符数组np.rec、np.char子模块core.records.*core.defchararray.*需要特别说明的是文档的排版约定.. autosummary::块中的函数会在文档站点自动生成独立 API 页面属于 MXNet 已实现并正式导出的接口而.. code::块中列出的如frombuffer、geomspace、vander、mgrid、ogrid等是对应 NumPy 同名函数、用于标注 API 对齐进度的参考项其中相当一部分在当前仓库的 python/mxnet/numpy 中尚未实现或未作为正式接口导出使用时需以mxnet.numpy实际可用 API 为准。二、全零、全一与填充数组Ones and Zeros这一类是模型初始化、掩码构造、权重分配时最高频的创建函数全部实现在 python/mxnet/numpy/multiarray.py。2.1zeros与ones最常用的定值初始化import mxnet.numpy as np import mxnet as mx np.zeros(5) # array([0., 0., 0., 0., 0.]) np.zeros((5,), dtypeint) # array([0, 0, 0, 0, 0], dtypeint64) np.zeros((2, 1)) # 二维全零 np.ones(5) # array([1., 1., 1., 1., 1.]) np.ones((5,), dtypeint) # array([1, 1, 1, 1, 1], dtypeint64) np.ones((2, 2)) # 全一方阵源码实现multiarray.py将zeros/ones直接委托给底层算子_mx_nd_np.zeros(shape, dtype, order, device)二者签名完全一致shapeint或int元组如(2, 3)或2dtype可选不传时由“默认 dtype”决定见下文 2.4order仅支持C行主序device内存分配设备默认mxnet.device.current_device()可传mx.gpu(0)直接把数组建在 GPU 上。2.2empty与full不初始化与按值填充np.empty([2, 2]) # 未初始化内容为任意值 np.empty([2, 2], dtypeint) # dtype 决定元素宽度 np.full((2, 2), 10) # array([[10., 10.], [10., 10.]]) np.full((2, 2), 2, dtypenp.int32, devicemx.cpu(0))emptymultiarray.py只分配内存、不写值速度最快order非C时直接抛出NotImplementedError。文档示例中的随机“垃圾值”正是未初始化内存的表现因此只在后续会立即整体覆写的场景下使用。fullmultiarray.py多一个fill_value参数同时支持out输出参数若传入out结果写入既有数组而不新分配。dtype缺省时由fill_value类型推断int → 默认整型、float → 默认浮点、bool → 布尔。注意full比 NumPy 多出device与out两个参数且暂不支持order选择。2.3*_like一族沿用既有数组的形状与类型a np.array([[1, 2, 3], [4, 5, 6]]) np.zeros_like(a) # 与 a 同形状同 dtype 的全零数组 np.ones_like(a) # 与 a 同形状同 dtype 的全一数组 np.full_like(a, 7) # 与 a 同形状同 dtype、填充 7 的数组 np.empty_like(a) # 与 a 同形状同 dtype、不初始化的数组zeros_likemultiarray.py、ones_likemultiarray.py、full_likemultiarray.py、empty_likemultiarray.py均支持用dtype覆盖结果类型、用shape覆盖结果形状。empty_like的subok参数当前仅支持Falseshape参数暂不支持源码 docstring 明确标注 Not supported at this moment使用时需留意。2.4 默认 dtype 机制float32还是float64这是 MXNet NumPy API 与官方 NumPy 最核心的行为差异。所有创建函数的 docstring 都写了同一段规则当npx.is_np_default_dtype()返回False默认默认浮点 dtype 为float32当npx.is_np_default_dtype()返回True即执行过npx.set_np(dtypeTrue)默认浮点 dtype 为float64与官方 NumPy 完全对齐。np.array([1, 2, 3]).dtype # dtype(float32)深度学习默认精度 npx.set_np(dtypeTrue) np.array([1, 2, 3]).dtype # dtype(float64)对齐官方 NumPyarange的默认 dtype 规则略有不同默认 dtype 模式下为float32set_np(dtypeTrue)后为int64见 multiarray.py 的 docstring 与示例。这条机制在 empty、array 的源码中直接体现dtype _np.float64 if is_np_default_dtype() else _np.float32。2.5eye与identity单位矩阵np.eye(2, dtypeint) # array([[1, 0], [0, 1]], dtypeint64) np.eye(3, k1) # 上对角线为 1 np.identity(3) # 3×3 单位阵eyemultiarray.pyN为行数、M为列数默认等于Nk为对角线偏移0 主对角线、正值上对角、负值下对角返回 2-D 数组identitymultiarray.py等价于eye(n)的方形特例仅接受n、dtype、device三个参数。三、从既有数据创建From Existing Data3.1array从 Python 序列/嵌套序列构造张量arraymultiarray.py接受array_like、numpy.ndarray、mxnet.numpy.ndarray或任意嵌套序列np.array([1, 2, 3]) # array([1., 2., 3.]) np.array([[1, 2], [3, 4]]) # 二维数组 np.array([[1, 0], [0, 1]], dtypebool) # 布尔数组实现细节上值得注意的三点类型推断规则若输入是ndarraydtype缺省时沿用输入 dtype否则按默认 dtypefloat32/float64推断禁止隐式转换mx.nd.NDArray若传入旧式mx.nd.NDArray源码会抛出ValueError提示改用零拷贝的as_np_ndarray函数——这是新老两套 NDArray 体系之间的刻意隔离错误透明内部先调用官方 NumPy 的np.array完成转换失败时把 NumPy 的原始异常信息原样透出raise TypeError(str(e))便于用户对照 NumPy 排查。3.2copy显式复制以隔离视图x np.array([1, 2, 3]) y x # 视图/引用共享内存 z np.copy(x) # 独立副本 x[0] 10 x[0] y[0] # Truey 跟着变 x[0] z[0] # Falsez 是独立副本copymultiarray.py返回输入数组的完整副本适用于需要“写时复制”语义、防止原地修改污染上游变量的场景。3.3 尚未在 MXNet 中实现的参考 API文档code块列出的frombuffer、fromfunction、fromiter、fromstring、loadtxt在 python/mxnet/numpy 源码中不存在对应实现笔者在全部模块中未检索到这些函数定义。它们属于 NumPy 兼容路线图上的待办项当前若需从字节流、迭代器或文本文件加载数据应改用 MXNet 现有的数据加载设施如 python/mxnet/io 模块的 DataLoader/ImageRecordIter或先用官方 NumPy 构造再通过np.array转换。四、数值区间Numerical Ranges4.1arange按步长生成等差数列arangemultiarray.py在半开区间[start, stop)上按固定步长生成序列与 Python 内置range语义一致但返回ndarraynp.arange(3) # array([0., 1., 2.]) np.arange(3.0) # array([0., 1., 2.]) np.arange(3, 7) # array([3., 4., 5., 6.]) np.arange(3, 7, 2) # array([3., 5.])要点start缺省为 0step缺省为 1若step以位置参数形式给出start必须同时显式给出浮点参数下结果长度由ceil((stop - start)/step)决定受浮点舍入影响末尾元素可能略大于stop默认 dtype 规则与整型/浮点参数相关默认模式is_np_default_dtype()为False下返回float32npx.set_np(dtypeTrue)后返回int64。4.2linspace按样本数生成等间距序列linspacemultiarray.py用“样本个数”而非“步长”控制序列默认在闭区间[start, stop]上生成 50 个点np.linspace(2.0, 3.0, num5) # array([2. , 2.25, 2.5 , 2.75, 3. ]) np.linspace(2.0, 3.0, num5, endpointFalse) # array([2. , 2.2, 2.4, 2.6, 2.8]) np.linspace(2.0, 3.0, num5, retstepTrue) # (array([...]), 0.25)同时返回步长参数速查endpointTrue时stop是最后一个样本否则排除retstepTrue时返回(samples, step)元组num必须非负。文档同时标注了与 NumPy 的两处差异start/stop暂不支持 list/ndarray 输入axis目前仅支持 0。4.3logspace对数刻度等间距logspacemultiarray.py在线性空间等分[start, stop]后取base的幂等价于base ** np.linspace(start, stop, num, endpoint)np.logspace(2.0, 3.0, num4) # array([100., 215.44347, 464.15887, 1000.]) np.logspace(2.0, 3.0, num4, endpointFalse) np.logspace(2.0, 3.0, num4, base2.0) # 以 2 为底 np.logspace(2.0, 3.0, num4, base2.0, dtypenp.int32) np.logspace(2.0, 3.0, num4, devicenpx.gpu(0)) # 直接在 GPU 上创建base缺省为 10.0axis目前仅支持 0。该函数常用于生成学习率衰减、频响分析等对数尺度下的采样点。4.4meshgrid由坐标向量生成网格坐标矩阵meshgrid实现在 python/mxnet/numpy/function_base.py接收一组一维坐标向量返回 N 维网格坐标数组是可视化、网格采样、插值的常用基础件x np.arange(3) y np.arange(2) X, Y np.meshgrid(x, y) # 默认 indexingxy笛卡尔 X2, Y2 np.meshgrid(x, y, indexingij) # 矩阵索引参数说明indexing支持xy默认笛卡尔与ij矩阵两种约定文档明确标注sparseTrue与copyFalse当前均不支持即只能返回稠密、复制的网格。indexingxy时输出形状为(N2, N1, ...)x1沿第二维展开ij时为(N1, N2, ...)。4.5 参考项geomspace、mgrid、ogridgeomspace几何刻度等间距、mgrid、ogrid网格切片对象在文档code块中列为参考但在当前仓库的mxnet.numpy源码中未检索到实现属于尚未落地的 NumPy 对齐项。需要几何序列时可用logspace 自定义base组合替代。五、构建矩阵Building Matrices5.1tril/triu提取下/上三角trilmultiarray.py把k对角线以上的元素置零返回同形状、同 dtype 的副本triumultiarray.py做相反操作a np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]]) np.tril(a, -1) # array([[ 0., 0., 0.], # [ 4., 0., 0.], # [ 7., 8., 0.], # [10., 11., 12.]])k 0默认为主对角线k 0向下偏移k 0向上偏移。两者常配合用于注意力掩码、三角矩阵求逆等场景。5.2tri构造下三角 0/1 矩阵trimultiarray.py直接生成一个下三角填充 1、其余为 0 的数组规则为T[i,j] 1当且仅当i j knp.tri(3, 5, 2, dtypeint) # array([[1, 1, 1, 0, 0], # [1, 1, 1, 1, 0], # [1, 1, 1, 1, 1]]) np.tri(3, 5, -1) # k-1对角线以下才为 15.3diag/diagflat对角提取与对角构造diagmultiarray.py是“双向”函数输入 1-D 数组时构造以之为对角线的 2-D 矩阵输入 2-D 数组时提取第k条对角线x np.arange(9).reshape((3, 3)) np.diag(x) # array([0, 4, 8]) —— 提取主对角线 np.diag(x, k1) # array([1, 5]) np.diag(x, k-1) # array([3, 7]) np.diag(np.diag(x)) # 把提取的对角线还原成对角矩阵diagflatmultiarray.py先展平输入再以其为第k条对角线构造 2-D 矩阵适合快速生成对角权重矩阵。5.4 参考项vandervander范德蒙德矩阵在文档code块中列为参考当前仓库的mxnet.numpy中未检索到实现属于待对齐项。六、记录数组与字符数组np.rec/np.char文档专门用两个小节说明结构化数据的创建入口记录数组np.rec是np.core.records的首选别名np.core.records仍可用相关创建例程包括core.records.array、core.records.fromarrays、core.records.fromrecords、core.records.fromstring、core.records.fromfile用于构造带字段名的结构化/记录数组字符数组np.char是np.core.defchararray的首选别名创建例程包括core.defchararray.array、core.defchararray.asarray用于字符串数组的批量操作。这两组接口沿用 NumPy 的模块层级命名在mxnet.numpy中对应子模块mxnet.numpy.rec、mxnet.numpy.char内可用。七、与官方 NumPy 的关键差异速查结合文档与源码multiarray.py 各函数 docstring 中的 differs from the original numpy 说明汇总如下差异点官方 NumPyMXNetmxnet.numpy默认浮点 dtypefloat64float32npx.set_np(dtypeTrue)后为float64arange默认 dtypeint64float32set_np后为int64device参数无几乎所有创建函数均支持如devicemx.gpu(0)order参数C/F/A/K仅支持C其余抛NotImplementedErrorout参数部分函数支持full/full_like等已支持输入类型任意array_likemx.nd.NDArray需先经as_np_ndarray零拷贝转换八、实战组合示例import mxnet.numpy as np import mxnet.numpy as npx import mxnet as mx # 1) 在 GPU 上直接创建 3×4 全一矩阵用于权重初始化 w np.ones((3, 4), devicemx.gpu(0)) # 2) 注意力掩码下三角为 1 mask np.tril(np.ones((5, 5))) # 3) 学习率序列对数刻度采样 lrs np.logspace(-3, -1, num5) # 4) 坐标网格可视化 / 采样 x np.arange(4); y np.arange(3) X, Y np.meshgrid(x, y, indexingxy) # 5) 拷贝隔离 params np.array([1.0, 2.0, 3.0]) safe np.copy(params)九、继续深入阅读API 文档总览docs/python_docs/python/api/np/routines.rst数组创建、操作、数学、统计、线性代数等例程导航核心实现python/mxnet/numpy/multiarray.pyeye见 L6204、linspace见 L6249、arange见 L6976meshgrid实现python/mxnet/numpy/function_base.pymxnet.numpy模块入口python/mxnet/numpy/init.py旧式 NDArray 与 NumPy 风格数组的转换约定可参考 python/mxnet/numpy/_op.py 及as_np_ndarray相关文档掌握这五类数组创建例程即可在 MXNet 中以 NumPy 心智模型完成从标量到批量张量的全部构造需求为后续的广播运算、自动微分与模型构建打下基础。【免费下载链接】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/mxne/mxnet创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考