2016-09-25 17 views
1

我正試圖找到所有向量對之間的曼哈頓距離。以下用於計算所有向量對之間距離的代碼有哪些錯誤?

import numpy as np 
import itertools 

class vector: 
    def __init__(self): 
     self.a = 0 
     self.b = 0 

c = vector() 
d = vector() 
l = vector() 
m = vector() 

e = [c,d] 
n = [l,m] 
o = np.array(n) 
f = np.array(e) 
p = itertools.product(o,f) 
p = list(p) 
def comp(x): 
    return (x[0].a-x[1].a) + (x[0].b-x[1].b) 

g = np.vectorize(comp) 
print g(p) 

我得到的錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 2207, in __call__ 
    return self._vectorize_call(func=func, args=vargs) 
    File "/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 2270, in _vectorize_call 
    ufunc, otypes = self._get_ufunc_and_otypes(func=func, args=args) 
    File "/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 2232, in _get_ufunc_and_otypes 
    outputs = func(*inputs) 
    File "<stdin>", line 2, in comp 
AttributeError: vector instance has no attribute '__getitem__' 

回答

2

我不得不說我不同的方法處理這個。數值Python不能很好地處理Python類等。

你的類

class vector: 
    def __init__(self): 
     self.a = 0 
     self.b = 0 

基本上是一個長度爲2的向量。所以,如果你打算在許多長度爲2的向量操作,我建議是這樣的:

In [13]: p = np.array([[1, 2], [3, 4], [5, 6]]) 

In [14]: p 
Out[14]: 
array([[1, 2], 
     [3, 4], 
     [5, 6]]) 

每一行是一個長度爲2的向量。有3個這樣的向量。這遠比Python類的Python list有效得多。現在

comp功能

def comp(x): 
    return (x[0].a-x[1].a) + (x[0].b-x[1].b) 

基本上等同於

def comp(x): 
    return (x[0].a+x[0].b) - (x[1].a+x[1].b) 

即第一矢量的分量總和,減去第二矢量的分量之和。既然如此,就可以有效地通過

In [15]: q = p.sum(axis=1) 

計算成對輸出,用於計算由

In [16]: np.subtract.outer(q, q) 
Out[16]: 
array([[ 0, -4, -8], 
     [ 4, 0, -4], 
     [ 8, 4, 0]]) 
0

每個矢量的分量總和,隨後你寫comp的方式,預計將用一個二元組作爲參數來調用,但那不會發生。 p是元組列表。當你調用矢量化函數時,它會被轉換爲一個numpy數組。元組被拆分成不同的列,所以你得到一個4x2數組。然後你的函數在這個數組的每個單元格上被調用。所以它只用一個矢量對象作爲參數來調用。

這不是很清楚你想在這裏完成什麼。如果你的物體不是數字,你就不會通過使用諸如np.vectorize之類的東西獲得任何東西;你應該在一個循環中調用你的函數。如果您的對象是數字,那麼只需將它們存儲在一個普通的numpy數組中,並使用更好的方法來計算這些距離,如函數scipy