2016-09-27 9 views
3

メッシュグリッドから対応する値を生成する方法をお聞きしたいと思います。私は2の長さの1D配列をとる関数 "foo"を持ち、実数を返します。meshgridデータからデータを生成する(Numpy)

import numpy as np 

def foo(X): 
    #this function takes a vector, e.g., np.array([2,3]), and returns a real number. 
    return sum(X)**np.sin(sum(X)); 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 

私はmeshgridを使用してXとYのグリッドを生成します。

次に、「foo」関数を使用して対応するZ値を生成して、3Dでプロットすることができます。たとえば、X、Y、Z値のplot_surface関数を使用したプロット?

ここで問題は、 "foo"関数を使用してXとYと同じ形状を持つZ値を生成する方法です。私の "foo"関数は1次元配列しか取っていないので、この関数をXとYでどのように使って、対応するZ値を生成できるのか分かりません。

+0

meshgridの各ポイント '(x、y)'に対して 'z = foo([x、y])'をしますか? – Praveen

答えて

2

np.dstackを使用して2つのnumpy配列を「深さ」に積み重ねてから、foo関数を変更して、スタックされた配列の最後の軸でのみ動作します。これは、簡単に代わりに組み込みsumを使用しての、パラメータaxis=-1np.sumを使用して行われます:

import numpy as np 

def foo(xy): 
    return np.sum(xy, axis=-1) ** np.sin(np.sum(xy, axis=-1)) 

x = np.arange(-2, 1, 1)   # points in the x axis 
y = np.arange(3, 8, 1)   # points in the y axis 
X, Y = np.meshgrid(x, y)   # X, Y : grid 
XY = np.dstack((X, Y)) 

をそして今、あなたが得る必要があります。

>>> XY.shape 
(5, 3, 2) 
>>> foo(XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 

あなたは同じ効果を実現したい場合は、 に変更しないと、fooを変更すると、np.apply_along_axisを使用できます。これは、必要なものを正確に実行する必要があります。

>>> np.apply_along_axis(foo, -1, XY) 
array([[ 1.  , 1.87813065, 1.1677002 ], 
     [ 1.87813065, 1.1677002 , 0.35023496], 
     [ 1.1677002 , 0.35023496, 0.2136686 ], 
     [ 0.35023496, 0.2136686 , 0.60613935], 
     [ 0.2136686 , 0.60613935, 3.59102217]]) 
+0

素晴らしいソリューションをありがとう。これはまさに私がやりたかったことです。しかし、私はコードブックにこのアプローチを適用するためにいくつかの問題を抱えています。私は実際にこの問題に関する別の質問を投稿した[リンク](http://stackoverflow.com/questions/39715227/making-a-function-that-c​​an-take-arguments-in-various-shapes)。私の実際のfoo関数は実際に 'return X [0] + X [1];'のようなものなので、ネストされた配列に対して反復演算を実行することはできず、(2、)の形しか取れません。したがって、実際のfoo関数にXYを置くと、エラーが発生します。この場合、Zをどのように生成できますか? –

+0

おっと、ごめんなさい、忘れました! –

+0

ちょうど(2、)形を取ることができる私の現在のfoo関数を使いたいならば、私はあなたのオブジェクトをどのように変更すべきか教えてください。 –

関連する問題