不常见的“用序列给数组赋值”错误

编程语言 2026-07-09

我在创建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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章