不常见的“用序列给数组赋值”错误
我在创建MRE时遇到了一个错误。
为什么这段代码:
from pandas import DataFrame as df
import numpy as np
from sklearn.neighbors import NearestNeighbors as nrb
from sklearn.decomposition import PCA
from pandas import pivot_table
dummy_df = df({"no": [9, 0], "T": ["im tired", "please help me"]})
dummy_df2 = df({"no": [9, 0], "vec": [3, 4]})
merger = dummy_df.merge(dummy_df2, on="no")
mat_sim = merger.pivot_table(index="T", values="vec")
print(mat_sim)
def dum_cusmet(x, x2):
return x, x2
model = nrb(n_neighbors=5, metric=dum_cusmet, algorithm="brute")
model.fit(mat_sim)
loc = mat_sim.loc[["im tired"], :].values
rng = model.radius_neighbors(loc, radius=0.5)
会导致这段“设置一个数组……”的错误:
TypeError Traceback (most recent call last)
TypeError: float() argument must be a string or a real number, not 'tuple'
The above exception was the direct cause of the following exception:
ValueError Traceback (most recent call last) /tmp/ipykernel_5714/3117530236.py in <cell line: 0>()
18
19 loc = mat_sim.loc[["im tired"], :].values
---> 20 rng = model.radius_neighbors(loc, radius=0.5)
5 frames
/usr/local/lib/python3.12/dist-packages/sklearn/neighbors/_base.py in radius_neighbors(self, X, radius, return_distance, sort_results)
1249 )
1250 if return_distance:
-> 1251 neigh_dist_chunks, neigh_ind_chunks = zip(*chunked_results)
1252 neigh_dist_list = sum(neigh_dist_chunks, [])
1253 neigh_ind_list = sum(neigh_ind_chunks, []) /usr/local/lib/python3.12/dist-packages/sklearn/metrics/pairwise.py in pairwise_distances_chunked(X, Y, reduce_func, metric, n_jobs, working_memory, **kwds)
2250 else:
2251 X_chunk = X[sl] -> 2252 D_chunk = pairwise_distances(X_chunk, Y, metric=metric, n_jobs=n_jobs, **kwds)
2253 if (X is Y or Y is None) and PAIRWISE_DISTANCE_FUNCTIONS.get(
2254 metric, None /usr/local/lib/python3.12/dist-packages/sklearn/utils/_param_validation.py in wrapper(*args, **kwargs)
214 )
215 ):
--> 216 return func(*args, **kwargs)
217 except InvalidParameterError as e:
218 # When the function is just a wrapper around an estimator, we allow /usr/local/lib/python3.12/dist-packages/sklearn/metrics/pairwise.py in pairwise_distances(X, Y, metric, n_jobs, force_all_finite, ensure_all_finite, **kwds)
2478 func = partial(distance.cdist, metric=metric, **kwds)
2479
-> 2480 return _parallel_pairwise(X, Y, func, n_jobs, **kwds)
2481
2482 /usr/local/lib/python3.12/dist-packages/sklearn/metrics/pairwise.py in _parallel_pairwise(X, Y, func, n_jobs, **kwds)
1971
1972 if effective_n_jobs(n_jobs) == 1:
-> 1973 return func(X, Y, **kwds)
1974
1975 # enforce a threading backend to prevent data communication overhead /usr/local/lib/python3.12/dist-packages/sklearn/metrics/pairwise.py in _pairwise_callable(X, Y, metric, ensure_all_finite, **kwds)
2031 x = X[[i], :] if issparse(X) else X[i]
2032 y = Y[[j], :] if issparse(Y) else Y[j]
-> 2033 out[i, j] = metric(x, y, **kwds)
2034
2035 return out
ValueError: setting an array element with a sequence.
```?
## 解决方案
你的度量需要接收两个向量,并输出一个标量。它目前输出的是一个元组。
例如,这样做会工作:
def dum_cusmet(x, x2): return np.sum(np.abs(x - x2))
然而,你现在所做的在这一行会失败
File ".../sklearn/metrics/pairwise.py", line 2045, in _pairwise_callable out[i, j] = metric(x, y, **kwds) ```
因为 metric 返回了两个向量,而 out[i, j] = ... 期望的是一个标量。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。