2017-03-11 9 views
0

私は、それぞれ緯度と経度のポイントセットの2つの入力numpy配列を持っています:latslonsです。Numpy:2つのnumpy配列に関数を適用し、2つのnumpy配列を返します。

私は(E,N)ペアにそれぞれ(lat,lon)ペアを変換する関数を継承しています

def convert(lat,lon): #takes two floats as arguments (unit: degrees) 
    ... 
    computation #Actual function is too long to post 
    ... 
    return N,E #returns two floats (unit: meters) 

私の質問:はどのように私は効率的に両方の入力numpyのアレイに同時に同じ機能を適用することができますか?

私はそれがリストを返すように機能を変更することを考えていた

return [N,E] 

ように:私はまだこれをテストしたが、それを見ていない

rows = int(lat.shape[0]) #lat and lon have the same shape 
cols = int(lat.shape[1]) 
easting=numpy.zeros(shape=(rows,cols)) 
northing=numpy.zeros(shape=(rows,cols)) 
for i in range(0, rows): 
    for j in range(0, cols): 
     northing=convert(lon[i][j])[0] #first element of the returned list 
     easting=convert(lat[i][j])[1] #second element of the returned list 

私はこれがうまくいくのは非常に快適ではないと感じています。どんな洞察も高く評価されます。

+0

にこれは 'convert'機能の詳細に依存しますと、それは、配列放送を適用します。あなたが望むように文字通りすでに動作しているかもしれませんし、 'math.sin'のようなものを' np.sin'に切り替える必要があるかもしれません。あるいは、コードができるAPIに依存していれば、一度に1組の要素を取るかどうかを制御したり置き換えたりしないでください。 – user2357112

答えて

1

のは

def convert(lat, lon): 
    return lat*np.pi/180, lon*np.pi/180 

frompyfuncが配列への「スカラー」関数を適用するのに有用な方法である些細な変換を定義してみましょう。

In [238]: out[0].astype(float) 
Out[238]: array([-0.78539816, -0.39269908, 0.  , 0.39269908, 0.78539816]) 
:あなたはおそらくfloat配列をしたいしながら、私たちも、それが2列に取る必要があり、かつ

In [233]: f = np.frompyfunc(convert,2,2) 
In [234]: lats=np.linspace(-45,45,5) 
In [235]: lons=np.linspace(0,100,5) 
In [236]: out = f(lats, lons) 
In [237]: out 
Out[237]: 
(array([-0.7853981633974483, -0.39269908169872414, 0.0, 0.39269908169872414, 
     0.7853981633974483], dtype=object), 
array([0.0, 0.4363323129985824, 0.8726646259971648, 1.3089969389957472, 
     1.7453292519943295], dtype=object)) 

一つの特徴は、オブジェクトの配列を返すことである(タプルで)2つの配列を返すことができます。

またはアンパックで:

In [239]: rlat, rlon = f(lats, lons) 
In [240]: rlat.astype(float) 
Out[240]: array([-0.78539816, -0.39269908, 0.  , 0.39269908, 0.78539816]) 

frompyfuncは、入力を反復ありません。他のテストでは、より明示的なループよりも2倍高速になる傾向があります。この場合、2つの結果を得るために2回呼び出す必要はありません。スカラーと同様アレイと同じようによく書かれ、このconvert作品として

ので

In [241]: convert(lats, lons) 
Out[241]: 
(array([-0.78539816, -0.39269908, 0.  , 0.39269908, 0.78539816]), 
array([ 0.  , 0.43633231, 0.87266463, 1.30899694, 1.74532925])) 

Pythonでループ任意のバージョンよりもはるかに速くされます。

したがって、実際にはconvertはアレイで直接動作します。しかし、それができないなら、frompyfuncはdo-it-yourselfループよりも控えめな改善です。 frompyfunc

もう一つの利点 -

f(lats[:,None], lons[None,:]) 
関連する問題