Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

convert numpy open mesh to coordinates

Tags:

python

numpy

I'd like to turn an open mesh returned by the numpy ix_ routine to a list of coordinates

eg, for:

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

What I would like is:

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

I'm pretty sure I could hack it together with some iterating, unpacking and zipping, but I'm sure there must be a smart numpy way of achieving this...

like image 887
MarkNS Avatar asked Apr 14 '26 20:04

MarkNS


1 Answers

Approach #1 Use np.meshgrid and then stack -

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

Approach #2 Alternatively, with np.array() and then transposing, reshaping -

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

For a generic case with for generic number of arrays used within np.ix_, here are the modifications needed -

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

Sample runs -

Two arrays case :

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

Three arrays case :

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]])
like image 166
Divakar Avatar answered Apr 17 '26 08:04

Divakar



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!