Skip to content Skip to sidebar Skip to footer

Variable Dimensionality Of A Meshgrid With Numpy

I try to create a meshgrid with n dimensions. Is there a nicer way to call meshgrid with n column vectors than with the if clause I am using? Edit: The goal is to use it for user-d

Solution 1:

I haven't fully absorbed your approach and goals, but here's a partial simplification

In [399]: r=np.arange(3)           # simpler range for example
In [400]: grid=np.meshgrid(*[r]*2)   # use `[r]*3` for 3d case
In [401]: grid=np.array(grid).T.reshape(-1,2)
In [402]: np.array([g for g in grid if g[0]<g[1]])  # simpler comprehensions
Out[402]: 
array([[0, 1],
       [0, 2],
       [1, 2]])

itertools.product makes that 2 column grid easier:

In [403]: from itertools import product
In [404]: np.array([g for g in product(r,r) if g[0]<g[1]])
Out[404]: 
array([[0, 1],
       [0, 2],
       [1, 2]])

That is, your grid before filtering is

In [407]: grid
Out[407]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])

and product is

In [406]: list(product(r,r))
Out[406]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

product has a repeat parameter that makes this even easier:

In [411]: list(product(r,repeat=2))
Out[411]: [(0, 0), (0, 1), (0, 2), (1, 0), (1, 1), (1, 2), (2, 0), (2, 1), (2, 2)]

You still need the if clause to apply the 2 step filtering for dim=3. I guess the could written iteratively

for i in range(0,dimension-1):
   grid = [g for g in grid if g[i]<g[i+1]]

Post a Comment for "Variable Dimensionality Of A Meshgrid With Numpy"