0

我正在使用带有 scipy 的cdist函数的自定义度量函数。自定义功能类似于

def cust_metric(u,v):
  dist = np.cumsum(np.gcd(u,v) * k) 
  return dist

其中 k 是任意系数。

理想情况下,我希望在像这样调用 cdist 时将 k 作为参数传递: d_ar = scipy.spatial.distance.cdist(arr1, arr2, metric=cust_metric(k=7)) 但是,这会引发错误。

我想知道是否有一个我可能会丢失的简单解决方案?一个快速但不优雅的解决方法是将 k 声明为全局变量并在需要时对其进行调整。

4

1 回答 1

0

根据其文档, for 的值metric应该是可调用的(或特定固定集合的字符串)。在您的情况下,您可以通过

def cust_metric(k):
    return lambda u, v: np.cumsum(np.gcd(u, v) * k)

我确实想象你的实际可调用对象从那一刻起看起来会有所不同,u并且v是二维数组,np.cumsum返回一个数组,而可调用对象应该产生一个标量。例如:

In [25]: arr1 = np.array([[5, 7], [6, 1]])

In [26]: arr2 = np.array([[6, 7], [6, 1]])

In [28]: def cust_metric(k):
    ...:     return lambda u, v: np.sqrt(np.sum((k*u - v)**2))
    ...:

In [29]: scipy.spatial.distance.cdist(arr1, arr2, metric=cust_metric(k=7))
Out[29]:
array([[51.03920062, 56.08029957],
       [36.        , 36.49657518]])

In [30]: scipy.spatial.distance.cdist(arr1, arr2, metric=cust_metric(k=1))
Out[30]:
array([[1.        , 6.08276253],
       [6.        , 0.        ]])
于 2020-05-19T18:04:18.970 回答