N维场景下如何让numpy.meshgrid+flatten匹配嵌套循环的输出?
问题:用np.meshgrid替代嵌套for循环时的维度顺序不匹配问题
尝试移除代码中冗余的嵌套for循环,但使用np.meshgrid()和np.flatten()无法复现相同的行为。以下是说明该问题的最小示例:
import numpy as np a = np.arange(0,10) b = np.arange(0,10) c = np.arange(0,10) mesh_tuple=np.meshgrid(*[a,b,c]) meshlist = [] for i in range(len(mesh_tuple)): meshlist.append(mesh_tuple[i].flatten()) meshlist = np.asarray(meshlist) list0, list1, list2 = [], [], [] for i0, p0 in enumerate(a): for i1, p1 in enumerate(b): for i2, p2 in enumerate(c): list0.append(p0) list1.append(p1) list2.append(p2) list0 = np.asarray(list0) list1 = np.asarray(list1) list2 = np.asarray(list2) print(np.array_equal(list0, meshlist[0,:])) print(np.array_equal(list1, meshlist[1,:])) print(np.array_equal(list2, meshlist[2,:])) print(np.array_equal(list0, meshlist[1,:])) print(np.array_equal(list1, meshlist[0,:])) print(np.array_equal(list2, meshlist[2,:]))
运行后输出:
False False True True True True
交换前两个索引只能解决3维场景的问题,请问有没有可推广至N维的解决方法?
解决方案
问题核心是np.meshgrid的默认索引模式与嵌套for循环的遍历顺序不匹配:
- 默认的
indexing='xy'(笛卡尔坐标模式)会交换前两个维度的遍历顺序,而嵌套for循环采用的是ij(矩阵索引模式)的顺序,即按输入数组的先后顺序依次遍历维度。 - 只需在调用
meshgrid时指定indexing='ij'参数,就能让生成的网格顺序和嵌套循环完全一致,且该方法适用于任意N维场景。
修改后的代码示例:
import numpy as np a = np.arange(0,10) b = np.arange(0,10) c = np.arange(0,10) # 指定indexing='ij'匹配嵌套循环的遍历顺序 mesh_tuple=np.meshgrid(*[a,b,c], indexing='ij') meshlist = [] for i in range(len(mesh_tuple)): meshlist.append(mesh_tuple[i].flatten()) meshlist = np.asarray(meshlist) list0, list1, list2 = [], [], [] for i0, p0 in enumerate(a): for i1, p1 in enumerate(b): for i2, p2 in enumerate(c): list0.append(p0) list1.append(p1) list2.append(p2) list0 = np.asarray(list0) list1 = np.asarray(list1) list2 = np.asarray(list2) # 所有对比均返回True print(np.array_equal(list0, meshlist[0,:])) print(np.array_equal(list1, meshlist[1,:])) print(np.array_equal(list2, meshlist[2,:]))
运行修改后的代码,三个print语句都会输出True,完美复现嵌套循环的结果。
内容的提问来源于stack exchange,提问作者martin m.
相关产品推荐
相关产品推荐

