Node.js使用python-shell调用sklearn聚类报数组维度错误如何解决
问题根源
- 参数传递类型错误:python-shell的
args参数仅支持传入字符串序列,你直接将JS二维数组dataset作为参数传入时,会被自动序列化逗号拼接的扁平字符串。Python侧拿到的sys.argv[1]本质是单个长字符串,不存在二维数组结构,用np.array()转换后只会得到包含单个字符串元素的标量数组,完全不符合sklearn要求的2D输入格式,因此触发报错:
ValueError: Expected 2D array, got scalar array instead
- 聚类数类型错误:
sys.argv[2]拿到的是字符串类型的聚类数量,而AgglomerativeClustering的n_clusters参数要求传入整数,这里也会触发隐式类型错误。
修复方案
1. Node.js侧修改
将二维数组序列化为JSON字符串再传递,避免自动扁平化:
app.post("/route", (req, res) => { let dataset = req.body.data; let clustNum = req.body.clustNum; let options = { args: [JSON.stringify(dataset), String(clustNum)] }; PythonShell.run('./hclust.py', options, function (err) { if (err) throw err; console.log('finished'); }); res.send("done") })
2. Python侧修改
用json模块解析传入的JSON字符串还原数组结构,同时将聚类数转为整数:
import sys import json import numpy as np from sklearn.cluster import AgglomerativeClustering X = np.array(json.loads(sys.argv[1])) cluster = AgglomerativeClustering(n_clusters=int(sys.argv[2]), affinity='euclidean', linkage='ward') cluster.fit_predict(X)
内容的提问来源于stack exchange,提问作者M.KH
相关产品推荐
相关产品推荐

