我试图在所有矢量对之间找到曼哈顿距离。
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__'
答案 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
函数。