ฉันมีตาราง lon/lat ที่ผิดปกติ (ไม่ใช่สี่เหลี่ยม) และมีจุดจำนวนมากในพิกัด lon/lat ซึ่งควรสอดคล้องกับจุดบนตาราง (แม้ว่ามันอาจจะผิดไปเล็กน้อยด้วยเหตุผลเชิงตัวเลข) ตอนนี้ฉันต้องการดัชนีของจุด lon/lat ที่สอดคล้องกัน
ฉันได้เขียนฟังก์ชันที่ทำสิ่งนี้ แต่มันช้ามาก
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]
ฉันค่อนข้างแน่ใจว่ามีวิธีแก้ปัญหาที่ดีกว่า (และเร็วกว่า) ใน numpy/scipy ฉันเคยไป Google ค่อนข้างมากแล้ว แต่คำตอบก็ยังหลบเลี่ยงฉันอยู่
มีข้อเสนอแนะใดเกี่ยวกับวิธีการค้นหาดัชนีของจุดที่เกี่ยวข้อง (ใกล้ที่สุด) ได้อย่างมีประสิทธิภาพ
ป.ล. คำถามนี้มาจากคำถามอื่น (คลิก)
แก้ไข: วิธีแก้ปัญหา
จากคำตอบของ @Cong Ma ฉันพบวิธีแก้ไขต่อไปนี้:
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]
เพื่อนำวิธีแก้ปัญหานี้และคำตอบจาก Divakar ไปสู่มุมมอง นี่คือการกำหนดเวลาบางส่วนของฟังก์ชันที่ฉันใช้ find_indices (และที่ซึ่งมันเป็นคอขวดในแง่ของความเร็ว) (ดูลิงก์ด้านบน):
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
เป็นแนวทางเริ่มต้นของฉัน pil1
Divakar's และ pil2
/pil3
วิธีแก้ปัญหาสุดท้ายด้านบน โดยที่ทรีถูกสร้างขึ้นทันทีใน pil2
(เช่น สำหรับการวนซ้ำทุกครั้งของลูปที่มีการเรียก find_indices
) และเพียงครั้งเดียวใน pil3
( ดูรายละเอียดหัวข้ออื่น) แม้ว่าการปรับปรุงแนวทางเริ่มต้นของ Divakar จะทำให้ฉันมีความเร็วเพิ่มขึ้น 3 เท่า แต่ cKDTree ก็ยกระดับสิ่งนี้ไปอีกระดับด้วยการเร่งความเร็วอีก 50 เท่า! และการย้ายการสร้างทรีออกจากฟังก์ชันจะทำให้สิ่งต่างๆ เร็วขึ้นอีก
find_indices
แต่ละครั้ง หากกริดของคุณได้รับการแก้ไขในการโทร คุณจะเสียเวลาในการสร้างต้นไม้ต้นเดียวกันซ้ำแล้วซ้ำอีก จริงๆ แล้ว การสร้างแผนผังนี้เป็นการเรียกที่ช้าที่สุดในฟังก์ชันนี้ - person Cong Ma   schedule 05.10.2015