Saya memiliki kisi-kisi bujur/latar belakang yang tidak beraturan (bukan persegi panjang) dan sekumpulan titik dalam koordinat bujur/latar belakang, yang harus sesuai dengan titik-titik pada kisi (walaupun mungkin sedikit melenceng karena alasan numerik). Sekarang saya memerlukan indeks titik bujur/latar belakang yang sesuai.
Saya telah menulis sebuah fungsi yang melakukan ini, tetapi ini SANGAT lambat.
def find_indices(lon,lat,x,y):
lonlat = np.dstack([lon,lat])
delta = np.abs(lonlat-[x,y])
ij_1d = np.linalg.norm(delta,axis=2).argmin()
i,j = np.unravel_index(ij_1d,lon.shape)
return i,j
ind = [find_indices(lon,lat,p*) for p in points]
Saya cukup yakin ada solusi yang lebih baik (dan lebih cepat) di numpy/scipy. Saya sudah cukup banyak mencari di Google, tetapi sejauh ini jawabannya masih belum saya ketahui.
Adakah saran bagaimana cara menemukan indeks titik (terdekat) yang sesuai secara efisien?
PS: Pertanyaan ini muncul dari pertanyaan lain (klik).
Sunting: Solusi
Berdasarkan jawaban @ Cong Ma, saya menemukan solusi berikut:
def find_indices(points,lon,lat,tree=None):
if tree is None:
lon,lat = lon.T,lat.T
lonlat = np.column_stack((lon.ravel(),lat.ravel()))
tree = sp.spatial.cKDTree(lonlat)
dist,idx = tree.query(points,k=1)
ind = np.column_stack(np.unravel_index(idx,lon.shape))
return [(i,j) for i,j in ind]
Untuk menempatkan solusi ini dan juga jawaban dari Divakar ke dalam perspektif, berikut adalah beberapa pengaturan waktu dari fungsi yang saya gunakan find_indices (dan di mana hambatannya dalam hal kecepatan) (lihat tautan di atas):
spatial_contour_frequency/pil0 : 331.9553
spatial_contour_frequency/pil1 : 104.5771
spatial_contour_frequency/pil2 : 2.3629
spatial_contour_frequency/pil3 : 0.3287
pil0
adalah pendekatan awal saya, pil1
Divakar, dan pil2
/pil3
solusi akhir di atas, di mana pohon dibuat dengan cepat di pil2
(yaitu untuk setiap iterasi loop di mana find_indices
dipanggil) dan hanya sekali dalam pil3
( lihat thread lain untuk detailnya). Meskipun penyempurnaan Divakar pada pendekatan awal saya memberi saya peningkatan kecepatan 3x, cKDTree membawa ini ke tingkat yang benar-benar baru dengan peningkatan kecepatan 50x lainnya! Dan memindahkan kreasi pohon dari fungsinya akan membuat segalanya menjadi lebih cepat.
find_indices
. Jika grid Anda diperbaiki di seluruh panggilan, Anda membuang-buang waktu untuk membuat pohon yang sama berulang kali. Sebenarnya konstruksi pohon ini adalah panggilan paling lambat dalam fungsi ini. - person Cong Ma   schedule 05.10.2015