Python 板


LINE

各位先進們好 我是一名基礎不太好的python新手QQ 現有一批大量的經緯度座標要做KNN 但我想添加一個距離限制(例如小於1000m才會被cluster) 參考網路上的做法,我目前是這樣寫的: 假設我有十組經緯度資料,陣列為: data_point=[[120.228986 22.92753 ] [120.222007 22.9854525] [120.21645 22.99625 ] [120.221625 22.99833 ] [120.1566975 22.987169 ] [120.281875 23.106358 ] [120.314682 23.319719 ] [120.219985 22.998485 ] [120.215055 22.99942 ] [120.20783 22.999415 ]] def np_getDistance(data, data_point, i, j): ra = 6378140 rb = 6356755 flatten = 0.003353 midLatA=data_point[i,1] midLonA=data_point[i,0] midLatB=data_point[j,1] midLonB=data_point[j,0] radLatA = np.radians(midLatA) radLonA = np.radians(midLonA) radLatB = np.radians(midLatB) radLonB = np.radians(midLonB) pA = np.arctan(rb / ra * np.tan(radLatA)) pB = np.arctan(rb / ra * np.tan(radLatB)) x = np.arccos( np.multiply(np.sin(pA),np.sin(pB)) + np.multiply(np.multiply(np.cos(pA),np.cos(pB)),np.cos(radLonA - radLonB))) c1 = np.multiply((np.sin(x) - x) , np.power((np.sin(pA) + np.sin(pB)),2)) / np.power(np.cos(x / 2),2) c2 = np.multiply((np.sin(x) + x) , np.power((np.sin(pA) - np.sin(pB)),2)) / np.power(np.sin(x / 2),2) dr = flatten / 8 * (c1 - c2) distance = 0.001 * ra * (x + dr) return distance for i in range(dataLen)): knn = KNN(i, K, data_point, tree) #計算KNN for j in knn: if l[i] != l[j]: if clusterSim(c[l[i]], c[l[j]], data, alpha) <= 1: if np_getDistance(data, data_point,l[i], l[j]) <= 1000: merge(c, l[i], l[j], l) 但是輸出的數值會直接不見=口= 請問我是計算上哪裡有問題,還是code寫錯了,還是array取錯了呢? 若不加np_getDistance的話code跑起來是沒問題 或者還有什麼有效率的方法可以從np.array兩兩計算經緯度的距離呢? 謝謝大家的指教QQ --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 1.174.118.160 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/Python/M.1673321616.A.AB6.html
1F:→ DavisX: 你func的 def 'data'和'data_mid_point' 和裡面的名稱不同01/10 14:07
啊對的,感謝我改正了,但還是跑不出來QQ ※ 編輯: piacere (223.138.15.215 臺灣), 01/10/2023 14:26:04
2F:→ DavisX: 你code不完整 建議你data大概留3點 每個有新算東西就print01/10 14:50
3F:→ DavisX: 你這算球面多點距離 太遠二點誤差太大又要踢掉01/10 14:53
大大我改成功了,目前看起來是正常,我的CODE改成: def rad(d): return d * math.pi / 180.0 def getDistance(data_point, ci, cj): EARTH_REDIUS = 6378.137 radLat1 = rad(data_point[ci,1]) radLat2 = rad(data_point[cj,1]) a = radLat1 - radLat2 b = rad(data_point[ci,0]) - rad(data_point[cj,0]) s = 2 * math.asin(math.sqrt(math.pow(sin(a/2), 2) + cos(radLat1) * cos(radLat2) * math.pow(sin(b/2), 2))) s = s * EARTH_REDIUS print("distance=",s*1000) return s*1000 #meters 目前又發現一個問題... 我在縮小距離範圍後,卻產生錯誤訊息QQ https://i.imgur.com/L3DKgGA.jpg 這個是什麼意思呢....資料量變多他也處理不了了QQ ※ 編輯: piacere (1.174.118.160 臺灣), 01/10/2023 15:25:45 ※ 編輯: piacere (223.138.15.215 臺灣), 01/10/2023 16:20:50
4F:推 wuyiulin: 你距離是怎麼抓的?話說你要的那個功能通常叫做 Mask01/10 16:36
5F:→ DavisX: 你pop()裡怎還有引數啊, 那pop不就沒效?01/10 17:03
6F:→ lycantrope: 沒有完整code只能算命,dict用pop但沒有key的error01/10 17:07
因為原始code太長不知道該怎麼縮減放上來....orz ※ 編輯: piacere (223.138.15.215 臺灣), 01/10/2023 17:16:07
8F:→ chang1248w: 我記得sklearn裡面有現成的可以用 01/10 21:12
9F:→ lycantrope: 通常是sklearn 把metrics換成經緯度距離 01/10 21:31







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:BabyMother站內搜尋

TOP