Microsoft PowerPoint - seminar-10-ch19-iterator.ppt



Similar documents
《C语言基础入门》课程教学大纲

第2章 数据类型、常量与变量

何 秋 琳 张 立 春 视 觉 学 习 研 究 进 展 视 觉 注 意 视 觉 感 知

说 明 为 了 反 映 教 运 行 的 基 本 状 态, 为 校 和 院 制 定 相 关 政 策 和 进 行 教 建 设 与 改 革 提 供 据 依 据, 校 从 程 资 源 ( 开 类 别 开 量 规 模 ) 教 师 结 构 程 考 核 等 维 度, 对 2015 年 春 季 期 教 运 行 基

类 似 地, 又 可 定 义 变 下 限 的 定 积 分 : ( ). 与 ψ 统 称 为 变 限 积 分. f ( ) d f ( t) dt,, 注 在 变 限 积 分 (1) 与 () 中, 不 可 再 把 积 分 变 量 写 成 的 形 式 ( 例 如 ) 以 免 与 积 分 上 下 限 的

修改版-操作手册.doc

生产支援功能 使用说明书(IP-110 篇)


,,,,, :,, (.,, );, (, : ), (.., ;. &., ;.. &.., ;, ;, ),,,,,,, ( ) ( ),,,,.,,,,,, : ;, ;,.,,,,, (., : - ),,,, ( ),,,, (, : ),, :,

2006年顺德区高中阶段学校招生录取分数线

I


登录、注册功能的测试用例设计.doc

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

正 规 培 训 达 规 定 标 准 学 时 数, 并 取 得 结 业 证 书 二 级 可 编 程 师 ( 具 备 以 下 条 件 之 一 者 ) (1) 连 续 从 事 本 职 业 工 作 13 年 以 上 (2) 取 得 本 职 业 三 级 职 业 资 格 证 书 后, 连 续 从 事 本 职 业

龚 亚 夫 在 重 新 思 考 基 础 教 育 英 语 教 学 的 理 念 一 文 中 援 引 的 观 点 认 为 当 跳 出 本 族 语 主 义 的 思 维 定 式 后 需 要 重 新 思 考 许 多 相 连 带 的 问 题 比 如 许 多 发 音 的 细 微 区 别 并 不 影 响 理 解 和

Template BR_Rec_2005.dot

Microsoft Word - 第7章 图表反转形态.doc

采 取 行 动 的 机 会 90% 开 拓 成 功 的 道 路 2

<4D F736F F D20BFC9B1E0B3CCD0F2BFD8D6C6CFB5CDB3C9E8BCC6CAA6B9FABCD2D6B0D2B5B1EAD7BC2E646F63>

3 复 试 如 何 准 备 4 复 试 成 绩 计 算 5 复 试 比 例 6 复 试 类 型 7 怎 么 样 面 对 各 种 复 试 04 05

Microsoft Word - 文件汇编.doc

金 不 少 于 800 万 元, 净 资 产 不 少 于 960 万 元 ; (3) 近 五 年 独 立 承 担 过 单 项 合 同 额 不 少 于 1000 万 元 的 智 能 化 工 程 ( 设 计 或 施 工 或 设 计 施 工 一 体 ) 不 少 于 2 项 ; (4) 近 三 年 每 年

0 年 上 半 年 评 价 与 考 核 细 则 序 号 部 门 要 素 值 考 核 内 容 考 核 方 式 考 核 标 准 考 核 ( 扣 原 因 ) 考 评 得 3 安 全 生 产 目 30 无 同 等 责 任 以 上 道 路 交 通 亡 人 事 故 无 轻 伤 责 任 事 故 无 重 大 质 量

Microsoft Word - 第3章.doc

<4D F736F F D C3E6CFF2B6D4CFF3A3A8B5DAC8FDD5C220C0E0CCD8D0D4A3A92E646F63>

附 件 : 上 海 市 建 筑 施 工 企 业 施 工 现 场 项 目 管 理 机 构 关 键 岗 位 人 员 配 备 指 南 二 一 四 年 九 月 十 一 日 2

ETF、分级基金规模、份额变化统计

( ) 信 号 与 系 统 Ⅰ 学 科 基 础 必 修 课 教 周 2016 年 06 月 13 日 (08:00-09:35) ( )


用节点法和网孔法进行电路分析

抗 日 战 争 研 究 年 第 期

全国建筑市场注册执业人员不良行为记录认定标准(试行).doc

Microsoft Word - GT21L16S2W简要说明V3.7.doc

导 数 和 微 分 的 概 念 导 数 的 几 何 意 义 和 物 理 意 义 函 数 的 可 导 性 与 连 续 性 之 间 的 关 系 平 面 曲 线 的 切 线 和 法 线 导 数 和 微 分 的 四 则 运 算 基 本 初 等 函 数 的 导 数 复 合 函 数 反 函 数 隐 函 数 以

18 上 报 该 学 期 新 生 数 据 至 阳 光 平 台 第 一 学 期 第 四 周 至 第 六 周 19 督 促 学 习 中 心 提 交 新 增 专 业 申 请 第 一 学 期 第 四 周 至 第 八 周 20 编 制 全 国 网 络 统 考 十 二 月 批 次 考 前 模 拟 题 第 一 学

上证指数

HSK( 一 级 ) 考 查 考 生 的 日 常 汉 语 应 用 能 力, 它 对 应 于 国 际 汉 语 能 力 标 准 一 级 欧 洲 语 言 共 同 参 考 框 架 (CEF) A1 级 通 过 HSK( 一 级 ) 的 考 生 可 以 理 解 并 使 用 一 些 非 常 简 单 的 汉 语


 编号:

深圳市新亚电子制程股份有限公司

定 位 和 描 述 : 程 序 设 计 / 办 公 软 件 高 级 应 用 级 考 核 内 容 包 括 计 算 机 语 言 与 基 础 程 序 设 计 能 力, 要 求 参 试 者 掌 握 一 门 计 算 机 语 言, 可 选 类 别 有 高 级 语 言 程 序 设 计 类 数 据 库 编 程 类

第 六 章 债 券 股 票 价 值 评 估 1 考 点 一 : 债 券 价 值 的 影 响 因 素 2

一 开 放 性 的 政 策 与 法 规 二 两 岸 共 同 的 文 化 传 承 三 两 岸 高 校 各 自 具 有 专 业 优 势 远 见 杂 志 年 月 日

际 联 考 的 非 美 术 类 本 科, 提 前 批 本 科 体 育 类 第 一 批 第 二 批 第 三 批 的 理 工 类 和 文 史 类 本 科 平 行 志 愿, 考 生 可 以 填 报 6 所 院 校 志 愿 符 合 贫 困 地 区 专 项 计 划 和 农 村 考 生 专 项 计 划 报 考

第二讲 数列

目 录 关 于 图 标... 3 登 陆 主 界 面... 3 工 单 管 理... 5 工 单 列 表... 5 搜 索 工 单... 5 工 单 详 情... 6 创 建 工 单... 9 设 备 管 理 巡 检 计 划 查 询 详 情 销 售 管

马 克 思 主 义 公 正 观 的 基 本 向 度 及 方 法 论 原 则!! # #

中 国 软 科 学 年 第 期!!!

<4D F736F F D C4EAB9A4B3CCCBB6CABFCAFDD1A7D7A8D2B5BFCEBFBCCAD4B4F3B8D9D3EBD2AAC7F3>

评 委 : 李 炎 斌 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

一 从 分 封 制 到 郡 县 制 一 从 打 虎 亭 汉 墓 说 起

抗 战 时 期 国 民 政 府 的 银 行 监 理 体 制 探 析 % # % % % ) % % # # + #, ) +, % % % % % % % %


名 称 生 命 科 学 学 院 环 境 科 学 1 生 物 学 仅 接 收 院 内 调 剂, 初 试 分 数 满 足 我 院 生 物 学 复 试 最 低 分 数 线 生 命 科 学 学 院 生 态 学 5 生 态 学 或 生 物 学 生 命 科 学 学 院

¹ º ¹ º 农 业 流 动 人 口 是 指 户 口 性 质 为 农 业 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个 月 及 以 上 的 流 动 人 口 非 农 流 动 人 口 是 指 户 口 性 质 为 非 农 户 口 在 流 入 地 城 市 工 作 生 活 居 住 一 个

收 入 支 出 项 目 2016 年 预 算 项 目 2016 年 预 算 预 算 01 表 单 位 : 万 元 ( 保 留 两 位 小 数 ) 一 公 共 财 政 预 算 拨 款 一 人 员 经 费 一 般 财 力 人 员 支 出 成 品

抗 日 战 争 研 究 % 年 第 期! # # % %

Cybozu Garoon 3 管理员手册

!!!!!!!!!!

教师上报成绩流程图

数 学 标 准 不 练 习 1.1 理 解 问 题 并 坚 持 解 决 这 些 问 题 1.2 以 抽 象 和 定 量 方 式 推 理 1.3 建 构 可 行 参 数 和 评 判 他 人 的 推 理 1.4 使 用 数 学 方 法 建 模 1.5 策 略 性 地 使 用 合 适 的 工 具 1.6

证券代码: 证券简称:长城电脑 公告编号:

<4D F736F F D D323630D6D0B9FAD3A6B6D4C6F8BAF2B1E4BBAFB5C4D5FEB2DFD3EBD0D0B6AF C4EAB6C8B1A8B8E6>

世华财讯模拟操作手册

自 服 务 按 钮 无 法 访 问 新 系 统 的 自 服 务 页 面 因 此 建 议 用 户 从 信 网 中 心 ( 主 页, 右 下 角 位 置 的 常 用 下 载, 或 校 园 网 用 户 自 服 务 ( 首 页

& & ( & ) +,! #

( 二 ) 现 行 统 一 高 考 制 度 不 利 于 培 养 人 的 创 新 精 神,,,,,,,,,,,,, [ ],,,,,,,,,,, :, ;,,,,,,? ( 三 ) 现 行 统 一 高 考 制 度 不 利 于 全 体 学 生 都 获 得 全 面 发 展,, [ ],,,,,,,,,,,

云信Linux SSH认证代理用户手册

精 勤 求 学 自 强 不 息 Born to win! 解 析 : 由 极 限 的 保 号 性 知 存 在 U ( a) 当 a 时 f ( ) f ( a) 故 f ( ) 在 点 a 不 取 极 值 f ( ) f ( a) f ( ) f ( a) lim lim a a a a ( a)

<4D F736F F D20B9D8D3DAB0BABBAAA3A8C9CFBAA3A3A9D7D4B6AFBBAFB9A4B3CCB9C9B7DDD3D0CFDEB9ABCBBE C4EAC4EAB6C8B9C9B6ABB4F3BBE1B7A8C2C9D2E2BCFBCAE92E646F6378>

(Microsoft Word - NCRE\314\345\317\265\265\367\325\37313\324\27221\272\3051.doc)

Microsoft Word - 资料分析练习题09.doc

黄 金 原 油 总 持 仓 增 长, 同 比 增 幅 分 别 为 4.2% 和 4.1% 而 铜 白 银 以 及 玉 米 则 出 现 减 持, 减 持 同 比 减 少 分 别 为 9.4%,9.4% 以 及 6.5% 大 豆, 豆 粕 结 束 连 续 4 周 总 持 仓 量 增 长, 出 现 小 幅


徐天宏:《基因天堂》.doc

<4D F736F F D20CAAEC8FDCEE5B9E6BBAED7EED6D5B8E5352E33312E646F63>

评 委 : 徐 岩 宇 - 个 人 技 术 标 资 信 标 初 步 审 查 明 细 表 序 号 投 标 单 位 投 标 函 未 按 招 标 文 件 规 定 填 写 漏 填 或 内 容 填 写 错 误 的 ; 不 同 投 标 人 的 投 标 文 件 由 同 一 台 电 脑 或 同 一 家 投 标 单

一 六 年 级 下 册 教 科 书 总 体 说 明 ( 一 ) 教 学 内 容 本 册 教 科 书 一 共 安 排 了 5 个 教 学 单 元, 其 中 前 4 个 单 元 为 新 知 识, 第 五 单 元 是 对 整 个 小 学 阶 段 所 学 数 学 知 识 系 统 的 整 理 和 复 习

Transcription:

NumPy 中 的 多 维 迭 代 器 代 码 之 美 第 19 章 江 涌

NumPy 是 Python 的 一 个 可 选 安 装 包, 提 供 了 一 个 功 能 强 大 的 N 维 数 组 对 象 NumPy 提 供 了 多 种 数 组 的 数 学 化 操 作 与 结 构 化 操 作, 使 得 Python 能 够 很 好 地 开 发 一 些 关 键 的 并 且 要 求 运 行 速 度 很 快 的 工 程 代 码 和 科 学 代 码 NumPy 中 通 过 切 片 (slicing) 的 概 念 来 实 现 快 速 结 构 化 操 作 记 法 为 [start:stop:stride], 例 如 im2=im[8:2:-1,9:1:-3] 按 照 slicing 方 式 选 取 的 新 影 像 将 与 原 始 影 像 共 享 数 据, 不 会 生 成 一 个 副 本, 减 少 计 算 机 资 源 的 消 耗

关 键 挑 战 经 常 需 要 遍 历 数 组 中 的 元 素, 在 遍 历 中 进 行 所 需 要 的 操 作 简 单 想 法 : 用 单 层 for 循 环 处 理 一 维, 双 层 for 循 环 处 理 两 维 但 当 维 数 N 是 一 个 任 意 整 数, 怎 么 办? 递 归 : 递 归 条 件 (recursive case), 基 线 条 件 (base case) Copy_ND(a,b,N) // 将 N 维 数 组 b 复 制 到 N 维 数 组 a 递 归 实 现 :if (N==0) copy memory from b to a return for i=0 to size of first dimension of a and b ptr_b=b[i] Copy_ND(ptr_a,ptr_b,N-1) a[i]=ptr_a

递 归 算 法 在 每 次 迭 代 中 进 行 函 数 调 用, 容 易 产 生 速 度 很 慢 的 代 码 ; 许 多 算 法 需 要 保 存 中 间 值 用 于 后 续 的 递 归 调 用 ( 求 最 大 值 ), 这 些 值 将 被 作 为 递 归 调 用 的 参 数 传 递, 很 难 提 供 用 于 递 归 解 决 方 案 的 简 化 工 具 因 此,NumPy 使 用 迭 代 来 完 成 迭 代 器 (Iterator) 是 一 种 简 化 这 些 算 法 的 抽 象, 包 含 了 单 个 循 环 内 遍 历 数 组 中 所 有 元 素 的 思 想 迭 代 器 的 两 个 基 本 方 法 : hasnext 是 否 还 有 下 一 个 元 素 ; next 返 回 下 一 个 元 素 for x in iterobj: process(x)

数 组 的 内 存 模 型 邻 接 型 数 组 : 在 内 存 中 连 续 存 放 一 个 二 维 4*5 数 组 >>>p=[[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20]] >>>from numpy import * >>>pp=array(p) >>>p1=pp[1:3,1:4] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

跨 度 数 组 中 某 一 维 的 跨 度 (stride): 沿 着 这 一 维, 或 者 说 数 轴, 从 数 组 中 的 一 个 元 素 移 动 到 下 一 个 元 素, 需 要 跳 过 多 少 字 节 ( 跨 度 可 以 是 负 数 ) pp: 第 一 维 跨 度 4*5, 第 二 维 跨 度 4; p1: 第 一 维 跨 度 4*5, 第 二 维 跨 度 4.

迭 代 器 设 计 迭 代 器 循 环 伪 码 : set up iterator (including pointing the current value to the first value in the array) while iterator not done: process the current value point the current value to the next value 设 计 分 为 三 部 分 : 1. Moving to the next value 2. Termination 3. Setup

递 进 确 定 按 怎 样 的 顺 序 来 提 取 元 素 NumPy 中 通 过 使 用 一 组 数 字 来 模 拟 简 单 计 数 而 实 现 用 N 元 整 数 组 来 表 示 当 前 位 置, 数 组 的 形 状 n1 n2... nn (0,,0) 表 示 数 组 第 一 个 元 素,( n1 1, n2 1,..., n N 1) 表 示 数 组 的 最 后 一 个 元 素 下 一 个 元 素 的 位 置 是 将 最 后 一 个 数 字 加 1 来 得 到 若 第 i 个 数 字 到 达 了 n i, 那 么 这 个 数 字 将 被 设 置 为 0, 而 第 (i-1) 个 数 字 将 增 1 比 如 对 于 数 组 来 说 3 2 3 (0,0,0)(0,0,1)(0,0,2)(0,1,0)(0,1,1)(0,1,2)(1,0,0)...(2,1,1)(2,1,2)

假 设 data 是 指 向 数 组 起 始 位 置 的 指 针,counter[N] 是 计 数 器 数 组,strides[N] 是 跨 度 值 数 组, 那 么 下 面 的 运 算 将 把 dataptr 设 置 为 指 向 数 组 当 前 值 的 第 一 个 字 节 : dataptr = (char *)data; for (i=0; i<n; i++) dataptr += counter[i]*strides[i]; 事 实 上 可 以 在 记 录 计 数 器 的 同 时 也 记 录 指 针, 当 计 数 器 的 第 i 个 下 标 增 1 时,dataptr 将 会 增 加 strides[] i ; 当 第 i 个 下 标 复 位 为 0 时, 数 组 当 前 值 的 内 存 地 址 应 该 减 去 ( n 1) strides[ i] i 迭 代 器 负 责 维 护 计 数 器 与 指 向 当 前 值 的 指 针

终 止 判 断 迭 代 器 何 时 完 成 及 如 何 发 出 终 止 信 号 1. 附 加 标 志 变 量 到 迭 代 器 上, 每 次 迭 代 中 都 进 行 判 断, 如 果 没 有 元 素 了 就 设 置 这 个 标 志 2. 查 找 在 第 一 维 的 计 数 器 中 从 ni 1 到 0 的 跃 迁 点 3. 如 果 给 定 了 数 组 的 大 小, 只 需 记 住 将 要 进 行 的 迭 代 次 数 NumPy 中 将 迭 代 的 总 次 数 作 为 信 息 保 存 下 来, 以 及 保 存 一 个 到 目 前 为 止 的 迭 代 次 数 的 动 态 计 数 器, 当 达 到 迭 代 的 总 次 数 时 迭 代 终 止

构 建 需 要 保 存 的 信 息 : 整 数 计 数 器 ( 初 始 设 置 为 0) 下 标 计 数 器 ( 初 始 设 置 为 (0,0,,0)) 判 断 是 否 基 于 简 单 的 邻 接 内 存, 设 置 标 志 保 存 判 断 结 果 为 了 加 速 回 卷 步 骤, 保 存 每 一 维 ( ni 1), 避 免 重 复 计 算 ( ni 1) strides[ i] 跨 度 信 息, 维 数 信 息, 元 素 数 量 保 存 系 数 li ( i = 1,... N) 来 简 化 整 数 计 数 器 与 下 标 计 数 器 的 转 化 当 前 指 针

数 组 中 的 每 一 项 都 可 以 用 一 个 在 0 和 n1... n N 之 间 1 的 整 数 k 或 者 下 标 计 数 器 ( k1,..., k N ) 来 表 示, 这 个 关 系 可 以 被 定 义 为 N N ( ) k k n = i i= 1 j=+ i 1 j 或 l1 = k N l mod( ) i = l i 1 nj k i j= i i = N n j j = i + 1 l

coords[n] dims_m1[n] strides[n] backstrides[n] nd_m1 dataptr size index factors 下 标 计 数 器 N 维 数 组 N 维 数 组 保 存 每 一 维 ni 1 N 维 数 组, 保 存 每 维 跨 度 N 维 数 组, 回 卷 时 需 要 移 动 的 数 量 strides[i] 维 数 ( ni 1) 指 向 当 前 位 置 内 存 的 指 针 所 有 元 素 数 量 n n n 1 2... N 整 数 计 数 器 从 0 变 到 size-1 计 算 一 维 下 标 和 N 维 下 标 转 换 时 辅 助 数 组

记 录 迭 代 计 数 器 注 意 计 数 器 的 递 进 都 是 从 最 后 一 维 增 1 开 始, 当 某 维 大 于 n 1 时 发 生 回 卷, 此 时 可 能 使 其 他 维 的 下 标 也 发 生 回 卷 i 于 是 可 以 从 最 后 维 开 始 向 前 循 环 在 当 前 维 上 判 断 当 前 下 标 是 不 是 小 于 n 1, 如 果 是, 则 将 下 标 位 置 加 1, 并 且 将 当 前 维 对 应 的 strides[i] 加 到 dataptr 上, 跳 出 循 环 ; 若 第 i 维 下 标 的 计 数 器 大 于 或 等 于 i n 1 i, 就 重 新 设 为 0, 且 将 dataptr 减 去 该 维 对 应 的 backstrides[i]( 回 卷 ), 继 续 循 环 判 断 前 一 维

C 语 言 实 现 for (i=it->nd_m1; i>=0; i--) { if (it->coords[i] < it->dims_m1[i]) { it->coords[i]++; it->dataptr += it->strides[i]; break; } else { it->coords[i] = 0; it->dataptr -= it->backstrides[i]; } }

使 用 while 语 句 done = 0; i = it->nd_ml; while (!done i>=0) { /*&&*/ if (it->coords[i] < it->dims_m1[i]) { it->coords[i]++; it->dataptr += it->strides[i]; done = 1; } else { it->coords[i] = 0; it->dataptr -= it->backstrides[i];} i--; }

NumPy 迭 代 器 的 结 构 typedef struct { PyObject_HEAD int nd_m1; npy_intp index, size; npy_intp coords[npy_maxdims]; npy_intp dims_m1[npy_maxdims]; npy_intp strides[npy_maxdims]; npy_intp backstrides[npy_maxdims]; npy_intp factors[npy_maxdims]; PyArrayObject *ao; char *dataptr; npy_bool contiguous; } PyArrayIterObject; 指 向 构 建 迭 代 器 的 原 始 数 组 的 指 针 判 断 是 否 邻 接 数 组

接 口 在 NumPy 中 it=pyarray_iternew(ao) ------------- 构 建 数 组 ao 的 迭 代 器 PyArray_ITER_NOTDONE(it) ------------- 判 断 迭 代 是 否 结 束 PyArray_ITER_NEXT(it) ------------- 实 现 迭 代 的 下 一 个 位 置 PyArray_ITER_DATA(it) ------------- 得 到 指 向 当 前 值 第 一 个 字 节 的 指 针

示 例 : 计 算 N 维 数 组 中 的 最 大 值 ( 假 设 数 组 ao 是 double 类 型 ) #include <float.h> double *currval, maxval=-dbl_max; PyArrayIterObject *it; it = PyArray_IterNew(ao); while (PyArray_ITER_NOTDONE(it)) { currval = (double *)PyArray_ITER_DATA(it); if (*currval > maxval) maxval = *currval; PyArray_ITER_NEXT(it); }

用 迭 代 器 处 理 邻 接 数 组 也 是 很 快 的, 但 是 更 快 的 还 是 传 统 办 法 : double *currval, maxval=-max_double; int size; currval = (double *)PyArray_DATA(ao); size = PyArray_SIZE(ao); while (size--) { if (*currval > maxval) maxval = *currval; currval += 1; }

迭 代 器 的 使 用 排 除 某 一 维 的 迭 代 当 操 作 不 涉 及 到 某 维 时 可 以 使 迭 代 器 跨 过 这 维 进 行 迭 代, 以 获 得 速 度 提 升 例 如 数 组 a[3][3], 只 想 修 改 a(0,0),a(1,0),a(2,0) 的 值 1 2 3 1 2 3

通 常 是 排 除 最 后 一 维,NumPy 的 前 身 Numeric 就 是 引 入 这 种 方 法 实 现 数 学 功 能 NumPy 中 对 迭 代 器 稍 微 改 动 it=pyarray_iterallbutaxia(array,&dim) dim 为 排 除 的 维 当 输 入 的 维 是 -1 时, 将 会 自 行 选 择 最 小 非 零 跨 度 值 的 维 另 一 种 经 常 的 选 择 就 是 排 除 有 最 大 元 素 数 量 的 维, 这 样 将 迭 代 次 数 降 至 最 低

实 现 : 1. 将 迭 代 大 小 除 以 将 要 移 除 的 维 的 长 度 ; 2. 将 被 选 择 的 维 的 元 素 数 量 设 置 为 1:dims_m1[i]=0; 3. 将 该 维 在 backstrides 中 相 应 位 置 上 的 值 设 置 为 0; 4. 将 邻 接 标 志 重 新 设 置 为 0, 因 为 现 在 要 处 理 的 数 组 在 内 存 中 将 不 会 是 邻 接 的 在 循 环 的 每 次 迭 代 中, 迭 代 器 将 指 向 数 组 所 选 择 维 的 第 一 个 元 素

迭 代 器 的 使 用 多 重 迭 代 数 组 加 法 需 要 多 个 迭 代 器, 每 个 输 入 数 组 一 个 迭 代 器, 并 且 输 出 数 组 一 个 迭 代 器 NumPy 提 供 了 一 个 多 重 迭 代 器, 可 以 对 多 个 迭 代 器 同 时 处 理 这 种 多 迭 代 器 经 常 用 于 自 动 处 理 NumPy 的 广 播 (broadcasting) 功 能 广 播 能 使 一 个 (4,1) 形 状 的 数 组 加 到 一 个 (3) 形 状 的 数 组 上, 得 到 形 状 (4,3) 的 数 组, 也 能 对 一 个 (5,1,1) 形 状 数 组, 一 个 (4,1) 形 状 数 组 和 一 个 (3) 形 状 数 组 进 行 运 算, 得 到 一 个 (5,4,3) 形 状 的 数 组

>>>p=array([[1,2,3], >>>a=array([[1],[2],[3],[4]]) [4,5,6], >>>a1=[2,1,4] [7,8,9]]) >>>print a+a1 >>>p1=[2,1,4] [[3,2,5], >>>print p+p1 [4,3,6], [[3,3,7], [5,4,7], [6,6,10], [6,5,8]] [9,9,13]]

The rules of broadcasting are: Arrays with fewer dimensions are treated as occupying the last dimensions of an array that has the full number of dimensions, so that all arrays have the same number of dimensions. The new, initial dimensions are filled in with 1s. The length of each dimension in the final broadcast shape is the greatest length of that dimension in any of the arrays.

For each dimension, all inputs must either have the same number of elements as the broadcast result or a 1 as the number of elements. Arrays with a single element in a particular dimension act as if that element were virtually copied to all positions during the iteration. In effect, the element is broadcast to the additional positions.

修 改 迭 代 器 实 现 广 播 功 能 : 修 改 迭 代 器 的 形 状 为 匹 配 广 播 的 形 状, 用 于 广 播 维 数 的 strides 和 backstrides 被 修 改 为 0, 这 样 这 一 维 递 进 时, 迭 代 器 不 会 移 动 数 据 指 针, 无 需 复 制 内 存

PyObject *multi; PyObject *in1, *in2; double *i1p, *i2p, *op; /* get in1 and in2 (assumed to be arrays of NPY_DOUBLE) */ /* first argument is the number of input arrays; the next (variable number of) arguments are the array objects */ multi = PyArray_MultiNew(2, in1, in2); /* construct output array */ out = PyArray_SimpleNew(PyArray_MultiIter_NDIM(multi), 输 出 数 组 PyArray_MultiIter_DIMS(multi), NPY_DOUBLE); 数 组 当 前 数 据 指 向 op = PyArray_DATA(out); 多 重 迭 代 器

while(pyarray_multiiter_notdone(multi)) { /* get (pointers to) the current value in each array */ i1p = PyArray_MultiIter_DATA(multi, 0); i2p = PyArray_MultiIter_DATA(multi, 1); /* perform the operation for this element */ *op = *ip1 + *ip2 op += 1; /* Advance output array pointer */ /* Advance all the input iterators */ PyArray_MultiIter_NEXT(multi); }

总 结 迭 代 器 是 一 个 非 常 漂 亮 的 抽 象 NumPy 的 迭 代 器 为 Python 的 数 组 运 算 提 供 了 很 强 大 的 灵 活 工 具, 并 且 无 需 考 虑 数 组 在 内 存 中 是 否 邻 接, 以 切 片 的 概 念 减 少 内 存 的 消 耗 它 的 优 化 循 环 与 广 播 机 制 都 是 其 漂 亮 的 发 光 点