[英]Variable dimensionality of a meshgrid with numpy
I try to create a meshgrid with n dimensions. 我尝试创建一个具有n个维度的网格。 Is there a nicer way to call meshgrid with n column vectors than with the if clause I am using?
有没有比我正在使用的if子句更好的方法来调用带有n个列向量的meshgrid?
Edit: The goal is to use it for user-defined n (2-100) without writing 100 if clauses. 编辑:目标是将其用于用户定义的n(2-100),而无需编写100 if子句。
The second line in the if clauses reduces the grid so column(n) < column(n+1) if子句的第二行减少了网格,因此column(n)<column(n + 1)
Example: 例:
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]<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]<grid[i,1]]])
grid = np.array(grid[[i for i in range(grid.shape[0]) if grid[i,1]<grid[i,2]]])
Edit: The solution was posted below: 编辑:解决方案发布在下面:
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]<g[i+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: itertools.product
使两列网格更容易:
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 也就是说,您的
grid
在过滤之前是
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 和
product
是
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: product
具有repeat
参数,这使此操作变得更加容易:
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. 您仍然需要
if
子句为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]]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.