numpy meshgrid与moveaxis结合后索引变化异常的原因咨询
问题:numpy meshgrid输出顺序不符合预期的原因
代码示例
import numpy as np def mesh(l): g = np.array(np.meshgrid(*l)) return np.moveaxis(g, 0, -1) mesh([[1,2],[3,4],[5,6]])
实际输出
array([[[[1, 3, 5], [1, 3, 6]], [[2, 3, 5], [2, 3, 6]]], [[[1, 4, 5], [1, 4, 6]], [[2, 4, 5], [2, 4, 6]]]])
疑问
为何输出中第三个索引(对应输入的[5,6])先发生变化,随后才是第一个索引(对应输入的[1,2])?预期的输出顺序应为[1, 3, 5]、[1, 3, 6]、[1, 4, 5]等,咨询该现象的原因。
解答
核心原因是numpy.meshgrid的**默认索引模式('xy'模式)**导致的:
meshgrid的默认行为
调用np.meshgrid(*l)等价于np.meshgrid([1,2], [3,4], [5,6])。在默认的'xy'笛卡尔坐标模式下,meshgrid会把第一个输入参数当作x轴(最后一个变化的维度),第二个当作y轴(倒数第二个变化的维度),第三个当作z轴(最先变化的维度)。初始网格的维度逻辑
生成的初始数组g形状为(3, 2, 2, 2):g[0]对应输入的[1,2],仅在最后一个维度上变化g[1]对应输入的[3,4],仅在倒数第二个维度上变化g[2]对应输入的[5,6],仅在倒数第三个维度上变化
moveaxis后的顺序
执行np.moveaxis(g, 0, -1)后,数组形状变为(2,2,2,3),每个位置的三个值对应(x,y,z)。此时遍历数组时,会先遍历z轴(第三个输入)的所有值,再遍历y轴,最后遍历x轴,就出现了你看到的输出顺序。
解决方法:使用'ij'索引模式
如果想要按输入列表的顺序优先变化(先第一个输入,再第二个,最后第三个),只需在调用meshgrid时指定indexing='ij':
import numpy as np def mesh(l): g = np.array(np.meshgrid(*l, indexing='ij')) return np.moveaxis(g, 0, -1) mesh([[1,2],[3,4],[5,6]])
此时输出就会符合你预期的顺序。
内容的提问来源于stack exchange,提问作者Mizar
相关产品推荐
相关产品推荐

