Variable dimensionality of a meshgrid with numpy
<p>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?</p>

<p>Edit: The goal is to use it for user-defined n (2-100) without writing 100 if clauses.</p>

<p>The second line in the if clauses reduces the grid so column(n) &lt; column(n+1)</p>

<p>Example:</p>

<pre><code>import numpy as np
dimension = 2
range = np.arange(0.2,2.4,0.1)
if dimension == 2:
    grid = np.array(np.meshgrid(range,range)).T.reshape(-1,dimension)
    grid = np.array(grid[[i for i in range(grid.shape[0]) if grid[i,0]&lt;grid[i,1]]])
 elif dimension == 3:
     grid = np.array(np.meshgrid(range,range,range)).T.reshape(-1,dimension)
     grid = np.array(grid[[i for i in range(grid.shape[0]) if grid[i,0]&lt;grid[i,1]]])
     grid = np.array(grid[[i for i in range(grid.shape[0]) if grid[i,1]&lt;grid[i,2]]])
</code></pre>

<p>Edit: The solution was posted below:</p>

<pre><code>dimension = 2
r = np.arange(0.2,2.4,0.1)
grid=np.array(np.meshgrid(*[r]*n)).T.reshape(-1,n)

for i in range(0,n-1):
    grid = np.array([g for g in grid if g[i]&lt;g[i+1]])
</code></pre>

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

<pre><code>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]&lt;g[1]])  # simpler comprehensions
Out[402]: 
array([[0, 1],
       [0, 2],
       [1, 2]])
</code></pre>

<p><code>itertools.product</code> makes that 2 column grid easier:</p>

<pre><code>In [403]: from itertools import product
In [404]: np.array([g for g in product(r,r) if g[0]&lt;g[1]])
Out[404]: 
array([[0, 1],
       [0, 2],
       [1, 2]])
</code></pre>

<p>That is, your <code>grid</code> before filtering is</p>

<pre><code>In [407]: grid
Out[407]: 
array([[0, 0],
       [0, 1],
       [0, 2],
       [1, 0],
       [1, 1],
       [1, 2],
       [2, 0],
       [2, 1],
       [2, 2]])
</code></pre>

<p>and <code>product</code> is</p>

<pre><code>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)]
</code></pre>

<p><code>product</code> has a <code>repeat</code> parameter that makes this even easier:</p>

<pre><code>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)]
</code></pre>

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

<pre><code>for i in range(0,dimension-1):
   grid = [g for g in grid if g[i]&lt;g[i+1]]
</code></pre>

python numpy