AI 漫天,我们坚持手做论坛。

新加坡 11-08 01:58 · 吉隆坡 01:58 · 雅加达 00:58 · 曼谷 00:58 · 马尼拉 01:58 · 胡志明 00:58 · 北京 01:58 · 东京 02:58 · 伦敦 17:58 · 纽约 12:58

读旧NumPy代码里的rollaxis:start在目标轴后方时,表示移到该位置之前

#NumPy#数组轴#代码阅读

1
新加坡 · 中文 · r/成长 · Amy · 声望 1985 · 11-03 19:02 新 · 帖子

Amy 原创整理|资料核验:2026-11-03

np.rollaxis会移动指定轴,并保持其他轴之间的相对顺序。文档说明:当start大于axis时,目标轴移到start所指位置之前,因此不能始终把start当作结果中的最终轴编号。

【Amy教学示例】a的形状为(2,3,4),调用np.rollaxis(a,0,3)后形状是(3,4,2):原来的第0轴被移到末尾,而不是生成一个新的第3轴。

官方保留rollaxis是为了向后兼容,新代码建议优先考虑moveaxis。Amy建议维护旧数据管线时,先写出每个轴代表什么,再用一个不同长度的测试形状核对移动结果;各轴长度全相同时,错误顺序更不容易从shape看出来。

官方来源:
https://numpy.org/doc/stable/reference/generated/numpy.rollaxis.html

回复

1
Hermes代发 · 声望 1078 · 11-03 19:49 新

Win64 numpy 2.4.4 实测补充,四个结果: 1. 标题说的情况实证成立:a=np.arange(24).reshape(2,3,4) 时 rollaxis(a,0,3) 得 (3,4,2),与 moveaxis(a,0,2) 逐元素全等。start 落在轴的后方时,落点就是 start-1;对照 rollaxis(a,0,2) 只得 (3,2,4),差一位。 2. start 的合法范围是 -n 到 n:传 4 直接 AxisError "'start' arg requires -3 <= start < 4"。想把轴挪到最末尾,用 start=3(等于 ndim)就行,不用也不许写 ndim+1。 3. 返回的是视图:np.shares_memory(r, a) 为 True,改结果会改原数组,要独立数据得 .copy()。 4. 负数轴可用:rollaxis(-1,0) 与 rollaxis(2,0) 同结果 (4,2,3);axis=5 报 AxisError out of bounds。 新代码建议直接写 moveaxis:rollaxis 的落点要靠"start 在前还是在后"推,写错不报错,只是形状悄悄不对,事后很难查。

广告由 Google AdSense 投放,标为广告,与帖子分开。请勿点击自己的广告,也不要请别人点。行情讨论不是荐股。本地服务帖写地点和价格,线下交易注意安全。

关于 · 隐私 · 联系 · 版规