将矢量从 C# 传递到 Python

Passing a vector from C# to Python

  1. 我使用 Python.Net 与 Python 库进行 C# 交互。我解决了文本分类的问题。我用的是FastText来索引和获取向量,还有Sklearn来训练分类器(Knn)。在实现过程中遇到了很多问题,但是都解决了,除了一个。 在收到我训练 Knn 的文本向量后,我将它们保存到一个单独的文本文件中,然后在必要时使用它。
    string loadKnowVec = File.ReadAllText("vectorKnowClass.txt", Encoding.Default);
    string[] splitKnowVec = loadKnowVec.Split('\r');
    splitKnowVec = splitKnowVec.Where(x => x != "").ToArray();
    for()
    { 
        keyValues_vector.Add(float.Parse(splitKnowVec[i], NumberFormatInfo.InvariantInfo), 1);
    }
        dynamic X_vec = np.array(keyValues_vector.Keys.ToArray()).reshape(-1, 1);
        dynamic y_tag = np.array(keyValues_vector.Values.ToArray());
        dynamic neigh = KNN(n_neighbors: 3);
        dynamic KnnFit = neigh.fit(X_vec, y_tag);
        string predict = neigh.predict("0.00889");
        MessageBox.Show("Скорее всего это: "+predict);

我在训练分类器的时候,遇到这样一个问题,从c#到python,不是float类型的值,而是System.Single[]的值。

Python.Runtime.PythonException: "TypeError : float() argument must be a string or a number, 
not 'Single[]'

此时动态 X_vec 的存储值为“System.Single[]”。(我认为这正是问题所在)

2.At首先我尝试手动设置X_vec的值,但是错误和它的值是一样的。 最初的想法是使用numpy库改变数组类型,但是没有用,还给出了"".

dynamic Xx = np.array(X_vec, dtype: "float"); 
dynamic yY = np.array(y_tag, dtype: "int");

接下来,尝试在更改数据类型之前,预先创建一个空数组并加载特定值,但这也没有用。

可能是我不明白MSVS19IDE和python解释器的构成和交互的原理

我解决了这个问题几天,每次我都认为值得阅读 python.net 上的文档。 结果,我找到了一个解决方案,结果证明它很平庸,有必要将 X_vec 表示为 float[] 而不是 List<float>

List<float> vectors = keyValues_vector.Keys.ToList();
List<int> classTag = keyValues_vector.Values.ToList();
dynamic a = np.array(vectors);
dynamic X_vec = a.reshape(-1, 1);
dynamic y_tag = np.array(classTag);