将numpy open mesh转换为坐标

时间:2017-04-05 10:20:19

标签: python numpy

我想将numpy ix_例程返回的开放网格转换为坐标列表

例如,对于:

In[1]: m = np.ix_([0, 2, 4], [1, 3])
In[2]: m
Out[2]: 
(array([[0],
        [2],
        [4]]), array([[1, 3]]))

我想要的是:

([0, 1], [0, 3], [2, 1], [2, 3], [4, 1], [4, 3])

我非常确定我可以将它与一些迭代,拆包和拉链一起破解,但我确信必须有一种聪明的方式来实现这一目标...

1 个答案:

答案 0 :(得分:2)

方法#1 使用np.meshgrid然后堆叠 -

r,c = np.meshgrid(*m)
out = np.column_stack((r.ravel('F'), c.ravel('F') ))

方法#2 或者,使用np.array()然后transposingreshaping -

np.array(np.meshgrid(*m)).T.reshape(-1,len(m))

对于np.ix_中使用的通用数组数的一般情况,以下是所需的修改 -

p = np.r_[2:0:-1,3:len(m)+1,0]
out = np.array(np.meshgrid(*m)).transpose(p).reshape(-1,len(m))

样品运行 -

两个数组案例:

In [376]: m = np.ix_([0, 2, 4], [1, 3])

In [377]: p = np.r_[2:0:-1,3:len(m)+1,0]

In [378]: np.array(np.meshgrid(*m)).transpose(p).reshape(-1,len(m))
Out[378]: 
array([[0, 1],
       [0, 3],
       [2, 1],
       [2, 3],
       [4, 1],
       [4, 3]])

三个阵列案例:

In [379]: m = np.ix_([0, 2, 4], [1, 3],[6,5,9])

In [380]: p = np.r_[2:0:-1,3:len(m)+1,0]

In [381]: np.array(np.meshgrid(*m)).transpose(p).reshape(-1,len(m))
Out[381]: 
array([[0, 1, 6],
       [0, 1, 5],
       [0, 1, 9],
       [0, 3, 6],
       [0, 3, 5],
       [0, 3, 9],
       [2, 1, 6],
       [2, 1, 5],
       [2, 1, 9],
       [2, 3, 6],
       [2, 3, 5],
       [2, 3, 9],
       [4, 1, 6],
       [4, 1, 5],
       [4, 1, 9],
       [4, 3, 6],
       [4, 3, 5],
       [4, 3, 9]])