我想将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])
我非常确定我可以将它与一些迭代,拆包和拉链一起破解,但我确信必须有一种聪明的方式来实现这一目标...
答案 0 :(得分:2)
方法#1 使用np.meshgrid
然后堆叠 -
r,c = np.meshgrid(*m)
out = np.column_stack((r.ravel('F'), c.ravel('F') ))
方法#2 或者,使用np.array()
然后transposing
,reshaping
-
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]])