2016-09-16 6 views
0

n次元のmeshgridを作成しようとしています。 使用しているif節よりもn列ベクトルでmeshgridを呼び出す方法がありますか?numpyでのmeshgridの可変次元

編集:目標は100個のif節を書くことなく、ユーザー定義のn(2-100)に使用することです。

節はグリッドを減少させる場合の2行目そうカラム(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(range、range)' v 'meshgrid(range、range、range)の気になりますか?私はあなたのコードの残りの部分が何をしているのか見ていません。 – 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]]) 

フィルタリングが

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である前に、あなたのgridすなわち

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はそのrepeatパラメータを持っていますマこのさらに簡単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)] 

あなたはまだ薄暗い= 3のフィルタリングを2段階に適用するif句を必要としています。私は繰り返し書くことができると思います。

for i in range(0,dimension-1): 
    grid = [g for g in grid if g[i]<g[i+1]] 
関連する問題