我是 scipy 的新手,最近了解到cdist
我们可以在哪里传递我们自己的自定义函数来计算距离。但是,cdist
仅计算单个点的距离(因此,自定义函数必须计算两点之间的距离)。这适用于大多数情况,但在我的情况下,要计算一组点之间的距离。(您可以将其视为滑动窗口,例如大小为 3)。一个例子可以清楚地说明这一点:
def f(*a, **kw):
print(a, kw)
return 0
# Consider it a set of points: [p0, p1, p2, ...]
a = numpy.array([[1,2,3],[10,11,12],[20,21,22],[30,31,32]])
# Consider it a set of points: [q0, q1, q2, ...]
b = numpy.array([[4,5,6],[14,15,16],[24,25,26],[34,35,36],[44,45,46]])
现在,如果我只是这样做scipy.spatial.distance.cdist(a, b, f)
,则每次f
调用时,每个数组中只有 1 个条目被传递给f
. 所以函数调用(和传递的值)看起来像:
1st call: p0, q0
2nd call: p0, q1
3rd call: p0, q2
4th call: p0, q3
5th call: p0, q4 <--
6th call: p1, q0
7th call: p1, q1
...and so on...
但我想要的是(对于大小为 3 的窗口):
1st call: [p0,p1,p2], [q0,q1,q2]
2nd call: [p0,p1,p2], [q1,q2,q3]
3rd call: [p0,p1,p2], [q2,q3,q4] <-- only till boundary
4th call: [p1,p2,p3], [q0,q1,q2]
5th call: [p1,p2,p3], [q1,q2,q3]
...and so on...
我搜索了很多,还尝试了 scipy 的通用过滤器和相关函数,但它们不提供该功能(据我了解)。有没有办法如上所述计算距离?
欢迎任何想法/建议。谢谢