Измените форму данных либо с помощью array.reshape(-1, 1), если ваши данные имеют одну функцию, либо с помощью array.reshape(1, -1), если они содержат одну ошибку выборки.

avatar
M.KH
1 июля 2021 в 16:10
100
0
0

Я пытаюсь использовать python в своем проекте node.js, используя оболочку npm python, мой скрипт python предназначен для иерархической кластеризации набора данных с использованием библиотеки sklearn. я отправляю набор данных в виде двумерного массива в скрипт Python, но получаю эту странную ошибку

Измените форму данных либо с помощью array.reshape(-1, 1), если ваши данные содержат одну функцию, либо с помощью array.reshape(1, -1), если они содержат одну ошибку выборки.

в сообщении об ошибке также указано:

 ValueError: Expected 2D array, got scalar array instead:\r\n
array=0.593934222,0.249954941,0.213356151,0.128768518,0.597381076,0.191858507,0.578032151,0.572388127,0.32216372,0.524071895,0.248102058,0.190557532,0.110445891,0.310592749,0.609993217,0.384038873,0.751802054,0.769711062,0.761773915,0.34313952,0.269207149,0.154800021,0.51600189,0.215849563,0.931827523,0.380445861,0.155714978,0.855579232,0.396393924,0.236950661,0.145275841,0.249733315,0.858764558,0.61553417,0.752858691,0.545378696,0.40406226,0.203121647,0.195151239,0.109380912,0.496808461,0.145746866,0.220833125,0.246972535,0.576208892.\r\n

я погуглил и кажется, что эта ошибка возникает, когда вы отправляете массив 1d, хотя я отправляю массив 2d.

вот код Python

import sys
import numpy as np
from sklearn.cluster import AgglomerativeClustering

X = np.array(sys.argv[1])

cluster = AgglomerativeClustering(n_clusters=sys.argv[2], affinity='euclidean', linkage='ward')
cluster.fit_predict(X)

вот код узла js, где вызывается скрипт python, я пока просто пытаюсь заставить его работать, поэтому подробностей не так много

app.post("/route", (req, res) => {
    let dataset=req.body.data;
    let clustNum=req.body.clustNum;
    let options = {
        args: [dataset,clustNum]
      };

    PythonShell.run('./hclust.py', options, function (err) {
        if (err) throw err;
        console.log('finished');
      });
    res.send("done")
})

вот пример того, как выглядят мои массивы данных:

[

[

0.593934222, 0.249954941,

0.213356151, 0.128768518,

0.597381076, 0.191858507,

0.578032151, 0.572388127,

0.32216372

],

[

0.524071895, 0.248102058,

0.190557532, 0.110445891,

0.310592749, 0.609993217,

0.384038873, 0.751802054,

0.769711062

],

[

0.761773915, 0.34313952,

0.269207149, 0.154800021,

0.51600189, 0.215849563,

0.931827523, 0.380445861,

0.155714978

],

[

0.855579232, 0.396393924,

0.236950661, 0.145275841,

0.249733315, 0.858764558,

0.61553417, 0.752858691,

0.545378696

],

[

0.40406226, 0.203121647,

0.195151239, 0.109380912,

0.496808461, 0.145746866,

0.220833125, 0.246972535,

0.576208892

]

]

что я делаю не так?

Источник
Mr Fooz
1 июля 2021 в 16:15
0

Какую именно ошибку вы видите? Можете ли вы воспроизвести эту проблему без узлов? Если это так, вы можете удалить из обсуждения всю информацию об узлах, поскольку она отвлекает от вашей реальной проблемы. ======== Угадайте: вам нужно преобразовать sys.argv[2] из строки в целое число, например. n_clusters=int(sys.argv[2]).

M.KH
1 июля 2021 в 16:16
0

хорошо, когда я пробовал точно такой же код с тем же массивом выше, используя чистый python, он работал без проблем, поэтому я думаю, что есть проблема с передачей аргументов между узлом и оболочкой python.

Ответы (0)