2016-09-16 40 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]]