私はPythonコードを使用していますが、それはかなり遅く、これをより効率的に行う方法が必要だと思います。 アイデアは画像にフィルタを適用することです。フィルタは、指定された半径内にある点の平均です。入力は、x、yを表すmx2
配列であり、m個の観測点の座標を表すmx1
配列zです。作品Pythonでイメージに円形フィルタを適用する/ numpy配列の各要素に関数を適用する
プログラムは
import numpy as np
def haversine(point, xy_list):
earth_radius = 6378137.0
dlon = np.radians(xy_list[:,0]) - np.radians(point[0])
dlat = np.radians(xy_list[:,1]) - np.radians(point[1])
a = np.square(np.sin(dlat/2.0)) + np.cos(np.radians(point[0])) * np.cos(np.radians(xy_list[:,0])) * np.square(np.sin(dlon/2.0))
return 2 * earth_radius * np.arcsin(np.sqrt(a))
def circular_filter(xy, z, radius):
filtered = np.zeros(xy.shape[0])
for q in range(xy.shape[0]):
dist = haversine(xy[q,:],xy)
masked_z = np.ma.masked_where(dist>radius, z)
filtered[q] = masked_z.mean()
return filtered
x = np.random.uniform(low=-90, high=0, size=(1000,1)) # x represents longitude
y = np.random.uniform(low=0, high=90, size=(1000,1)) # y represents latitude
xy = np.hstack((x,y))
z = np.random.rand(1000,)
fitered_z = circular_filter(xy, z, radius=100.)
次のような問題は、私は、データセットごとに600万ポイントを持っているということです、そしてコードが恐ろしく遅いです。これをより効率的に行う方法が必要です。高速であるscipy.spatial.distance.cdist()を使用することを考えましたが、データをUTMに再投影する必要がありました。再投影を避けたいと思います。助言がありますか?
おかげで、 Reniel
私はnumpyに精通していませんが、スライスを繰り返し処理するために、データセットをスライスしてマルチプロセッシングを使用することは可能ですか?マシンの各コアごとに1つのプロセス?私はPythonのCPUスケーリング方法を探していて、numbaを見つけたとしても、試してみることができます。 – geckos