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



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

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

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

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

国债回购交易业务指引

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

修改版-操作手册.doc

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


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

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

I

2. 本 次 修 改 后, 投 资 者 申 购 新 股 的 持 有 市 值 要 求 市 值 计 算 规 则 及 证 券 账 户 使 用 的 相 关 规 定 是 否 发 生 了 变 化? 答 : 未 发 生 变 化 投 资 者 申 购 新 股 的 持 有 市 值 是 指, 以 投 资 者 为 单 位


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

4.3.3 while 语 句 用 于 无 限 循 环 当 while 语 句 的 表 达 式 永 远 不 会 为 布 尔 假 时, 循 环 将 永 远 不 会 结 束, 形 成 无 限 循 环, 也 称 死 循 环 使 用 while 语 句 构 成 无 限 循 环 的 格 式 通 常

<433A5C446F63756D656E E E67735C41646D696E F725CD7C0C3E65CC2DBCEC4CFB5CDB3CAB9D3C3D6B8C4CFA3A8BCF2BBAFA3A95CCAB9D3C3D6B8C4CF31302D31392E646F63>

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

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

i 1) 系 统 运 作 前 设 定 *1. [2.1 网 页 主 机 名 称 设 定 ] -- 设 定 校 务 系 统 的 主 机 IP 地 址, 以 供 其 他 个 人 电 脑 连 接 及 使 用 该 系 统 *2. [2.3.1 输 入 / 修 改 学 校 资 料 ] -- 输 入 系 统 使

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) ( )


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

国际财务报告准则第13号——公允价值计量

抗 日 战 争 研 究 年 第 期

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

2 熟 悉 Visual Basic 的 集 成 开 发 环 境 3 了 解 可 视 化 面 向 对 象 编 程 事 件 驱 动 交 互 式 开 发 等 基 本 概 念 4 了 解 Visual Basic 的 特 点 环 境 要 求 与 安 装 方 法 1 Visual Basic 开 发 应 用

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 D20B5E7D7D3B7A2CEC4CEC4CDB7A3A8D2CBB1F6D1A7D4BACEC4BCFEA3A92E646F63>

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

中 国 软 科 学 年 第 期!!!

<4D F736F F D C4EAB9A4B3CCCBB6CABFCAFDD1A7D7A8D2B5BFCEBFBCCAD4B4F3B8D9D3EBD2AAC7F3>

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

系统设计文档_样稿管理模块 V1.1_.doc

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

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

B-002 行 政 处 罚 在 气 象 探 测 环 境 保 护 范 围 内 从 事 危 害 气 象 探 测 环 境 活 动 的 处 罚 中 华 人 民 共 和 国 气 象 法 第 三 十 五 条 第 一 款 第 二 项 B-003 行 政 处 罚 在


名 称 生 命 科 学 学 院 环 境 科 学 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>

世华财讯模拟操作手册

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

& & ( & ) +,! #

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


上海证券交易所会议纪要

2 任 务 目 标 任 务 实 施 学 一 学 安 全 用 电 1. 安 全 用 电 的 意 义 2. 人 体 触 电 的 基 本 知 识 1 2 1mA 10 30mA 50mA 100mA 750ms Hz

云信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>

文档编号:

<4D F736F F D20B9D8D3DA BDECB1CFD2B5C9FAC5C9C7B2B1A8B5BDB5C8D3D0B9D8B9A4D7F7B5C4CDA8D6AAA3A E362E38A3A92E646F63>

<4D F736F F D20D0A3B7A2A1B A1B BAC5B9D8D3DAD7E9D6AFBFAAD5B9C8ABD0A3BDCCD6B0B9A4B8DACEBBC6B8D3C3B1E4B6AFB9A4D7F7B5C4CDA8D6AA2E646F63>

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

PowerPoint 演示文稿

上海证券交易所会议纪要

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

在2012年工作会议结束时的讲话

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 的 数 组 运 算 提 供 了 很 强 大 的 灵 活 工 具, 并 且 无 需 考 虑 数 组 在 内 存 中 是 否 邻 接, 以 切 片 的 概 念 减 少 内 存 的 消 耗 它 的 优 化 循 环 与 广 播 机 制 都 是 其 漂 亮 的 发 光 点