2017-04-05 14 views
2

我想轉由numpy的ix_例程返回一個開放的網格座標轉換numpy的開放式網格座標

如列表,用於:

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]) 

我敢肯定,我可以做一些迭代一起破解它,開箱和荏苒,但我敢肯定,必須有實現這一目標的智能numpy的方式...

回答

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_內使用的通用數量的陣列,h ERE的修改需要 -

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]])