2014-11-04 24 views
0

我有100個站和點A(x,y)
我需要找到最近的站到A.我找到解決方案here,但它會拋出一個錯誤。蟒蛇 - 高效的方式來找到最近的點在二維

這裏是我做過什麼:

def closest_node(node, listStation): 
    nodes = [] 
    for i in xrange(1,len(listStation)): 
     nodes.append((listStation[i][12],listStation[i][13])) 
    nodes = np.asarray(nodes) 
    dist_2 = np.sum((nodes - node)**2, axis=1) 
    return np.argmin(dist_2) 

print closest_node(((99,100)), listStation) 

這裏是錯誤:

dist_2 = np.sum((nodes - node)**2, axis=1) 
TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'tuple' 

由於@WeaselFox,所不同的是,我從CSV文件中得到的數據。這裏是解決方案:

def closest_node(node, listStation): 
    nodes = [] 
    for i in xrange(1,len(listStation)): 
     a = np.asanyarray((float(listStation[i][12]),float(listStation[i][13]))) 
     nodes.append(a)   

    nodes = np.asarray(nodes)  
    dist_2 = np.sum((nodes - node)**2, axis=1) 
    return np.argmin(dist_2) 

回答

1

您需要將您的節點強制轉換爲NP數組numpy的計算距離:

node = np.asarray(node) 

例如:

>>> a = np.asarray((1,2)) 
>>> b = np.asarray((2,3)) 
>>> c = np.asarray((1,1)) 
>>> nodes = [b,c] 
>>> dist_2 = np.sum((a - nodes)**2, axis=1) 
>>> nodes[np.argmin(dist_2)] 
array([1, 1]) 
+0

你能做到這一點(節點)作爲第一個列表。因爲,它一直拋出一個錯誤「不受支持的操作數類型(s) - :'numpy.ndarray'和'numpy.ndarray'' – Jackie 2014-11-04 08:16:33

+0

奇怪,nupy數組有一個'__sub__'方法。請用當前代碼更新您的問題。此外,正如Iv'e所示,代碼對於numpy數組非常適用。 – WeaselFox 2014-11-04 08:22:47

+0

我已更新問題 – Jackie 2014-11-04 08:26:13