在 Scipy 的 cdist (或 pdist) 的自定义函数中使用额外的 kwargs?

问题描述 投票:0回答:1

我正在使用一个自定义的度量函数与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 声明为一个全局变量,并在需要时调整它。

python numpy scipy distance pdist
1个回答
0
投票

根据 其文件价值 metric 应该是一个可调用的(或者是一个特定固定集合的字符串)。在你的情况下,你可以通过

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

我可以想象,你的实际可调用看起来会有些不同,因为那一刻的 uv 是二维数组。np.cumsum 返回一个数组,而callable应该产生一个标量。例如:

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.        ]])
© www.soinside.com 2019 - 2024. All rights reserved.