2016-09-16 54 views
0

我尝试创建一个具有n维的meshgrid。 是否有更好的方法来调用与n列向量相比meshgrid比我使用的if子句?具有numpy的meshgrid的变维数

编辑:目标是将其用于用户定义的n(2-100),而不写入100个子句。

在如果条款降低了电网的第二线,使得列(n)<列(n + 1)

实施例:

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

编辑:将溶液下面贴:

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

你是否只是''meshgrid(范围,范围)'v's meshgrid(范围,范围,范围)'?我没有看到你的代码的其他部分。 – hpaulj

+0

[numpy中是否有多维版本的arange/linspace?](http://stackoverflow.com/questions/32208359/is-there-a-multi-dimensional-version-of-arange-linspace -in-numpy) – farenorth

+0

覆盖原生python例程通常是一个糟糕的主意,特别是像'range'一样有用的例子。 –

回答

1

我还没有完全吸收你的方法和目标,但这里有部分简化

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使得这2柱网更容易:

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

也就是说,过滤之前你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]]) 

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

productrepeat参数嘛KES这个更简单:

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

你仍然需要if条款应用2步在弱光= 3过滤。我猜这可能是反复写的

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