为 Scipy 的 cdist(或 pdist)使用带有自定义函数的附加 kwargs?
Using Additional kwargs with a Custom Function for Scipy's cdist (or pdist)?
我正在使用带有 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 声明为全局变量并在需要时调整它。
根据 its documentation,metric
的值应该是可调用的(或特定固定集合的字符串)。在你的情况下,你可以通过
获得
def cust_metric(k):
return lambda u, v: np.cumsum(np.gcd(u, v) * k)
我想你的实际可调用看起来会有些不同,因为 u
和 v
是二维数组,np.cumsum
returns 是一个数组,而可调用应该产生一个标量。例如:
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. ]])
我正在使用带有 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 声明为全局变量并在需要时调整它。
根据 its documentation,metric
的值应该是可调用的(或特定固定集合的字符串)。在你的情况下,你可以通过
def cust_metric(k):
return lambda u, v: np.cumsum(np.gcd(u, v) * k)
我想你的实际可调用看起来会有些不同,因为 u
和 v
是二维数组,np.cumsum
returns 是一个数组,而可调用应该产生一个标量。例如:
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. ]])