以下代码用于计算所有向量对之间的距离有什么问题?

时间:2016-09-25 06:34:22

标签: python vectorization itertools

我试图在所有矢量对之间找到曼哈顿距离。

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 个答案:

答案 0 :(得分:2)

我不得不说我的处理方式不同。数值Python并不能很好地处理Python类等。

你的班级

start of while loop
abc def ghi
result.size() 1
start of while loop
result.size() 1
start of while loop     
result.size() 1

基本上是长度为2的向量。所以,如果您要使用许多长度为2的向量,我会建议这样的事情:

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

每行是长度为2的向量。有3个这样的载体。这远远比Python类的Python In [13]: p = np.array([[1, 2], [3, 4], [5, 6]]) In [14]: p Out[14]: array([[1, 2], [3, 4], [5, 6]]) 更有效。

现在是您的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)

答案 1 :(得分:0)

你编写comp的方式,它希望以两元组作为参数调用,但事实并非如此。 p是元组列表。当您在其上调用矢量化函数时,它将转换为numpy数组。元组被拆分为单独的列,因此您将获得一个4x2阵列。然后在该数组的每个单元格上调用您的函数。因此只用一个矢量对象作为参数调用它。

你在这里想要完成的事情并不是很清楚。如果你的对象不是数字,你就不会通过np.vectorize之类的东西获得任何东西;你应该循环调用你的函数。如果您的对象是数字,那么只需将它们存储在普通的numpy数组中,并使用更好的方法来计算这些距离,例如pdist中的scipy函数。