【问题标题】:Convert a array List to a simple list将数组 List 转换为简单列表
【发布时间】:2019-11-07 01:47:09
【问题描述】:

我尝试使用来自 sklearn.metrics 的分类报告:

sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)

作为预测和标签的输入,我有一个列表,每个列表具有以下形式:

预测:

[array([0, 0, 0, 3, 0, 3, 2, 2, 1, 1, 2, 0, 2, 3, 0, 2, 2, 2, 2, 3, 3, 2,
       2, 2, 2, 2, 2, 1, 0, 3, 2, 2, 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 2, 2,
       2, 1, 0, 0, 0, 2, 2, 0, 2, 0, 2, 1, 0, 2, 2, 3, 0, 2, 0, 2])]

为真:

[array([2, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3,
       2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 2, 2, 2, 2, 2, 3, 2,
       2, 2, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2])]

对于上面的 sklearn 函数,我需要一个简单的列表。数组产生错误:

ValueError:不支持多类多输出

我已经尝试过.tolist(),但对我不起作用。

我正在寻找将我的数组列表 [?] 转换为简单列表的可能性。

感谢您的帮助。

【问题讨论】:

  • 请为您的代码使用代码块({} 图标)。
  • 也许您需要单元素列表的第一个元素:y_true[0]y_pred[0],您尝试过吗?
  • 为什么要发送一个长度为 1 的列表,其中包含一个数组?直接发送数组?
  • “我正在寻找将我的数组列表 [?] 转换为简单列表的可能性。”您可以毫无问题地传递 numpy 数组。但是由于某种原因,您将数组包装在列表中。所以不是pred = [np.array([0, 0, ...,])] 而是pred = np.array([0, 0, ...,])。如果您可以显示生成 predtrue 的代码,则可能更明显的是您的错误是将它们放入单个元素列表中。
  • @VomDorfe 看看我的回答

标签: python arrays list scikit-learn


【解决方案1】:

这些对象中的每一个都已经是一个列表,每个列表都包含一个元素,即一个数组。

要访问第一个元素并将其转换为列表,请尝试以下操作:

x = [array([2, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 3,
   2, 2, 3, 2, 2, 2, 2, 2, 2, 2, 3, 2, 2, 3, 3, 2, 2, 2, 2, 2, 3, 2,
   2, 2, 3, 3, 3, 2, 2, 2, 2, 3, 3, 3, 2, 2, 3, 2, 2, 2, 2, 2])]
x_list = list(x[0])

并且 x_list 将包含列表形式的数组元素。

【讨论】:

    【解决方案2】:

    方式 1:只需索引列表,例如pred[0]

    代码:

    pred = [array([0, 0, 0, 3, 0, 3, 2, 2, 1, 1, 2, 0, 2, 3, 0, 2, 2, 2, 2, 3, 3, 2,
                2, 2, 2, 2, 2, 1, 0, 3, 2, 2, 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 2, 2,
                2, 1, 0, 0, 0, 2, 2, 0, 2, 0, 2, 1, 0, 2, 2, 3, 0, 2, 0, 2])]
    
    test = [array([0, 0, 0, 3, 0, 3, 2, 2, 1, 1, 2, 0, 2, 3, 0, 2, 2, 2, 2, 3, 3, 2,
                2, 2, 2, 2, 2, 1, 0, 3, 2, 2, 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 2, 2,
                2, 1, 0, 0, 0, 2, 2, 0, 2, 0, 2, 1, 0, 2, 2, 3, 0, 2, 0, 2])]
    
    classification_report(pred[0], test[0])
    

    方式二:

    对其进行修改以符合sklearn 的要求:

    pred = [array([0, 0, 0, 3, 0, 3, 2, 2, 1, 1, 2, 0, 2, 3, 0, 2, 2, 2, 2, 3, 3, 2,
                2, 2, 2, 2, 2, 1, 0, 3, 2, 2, 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 2, 2,
                2, 1, 0, 0, 0, 2, 2, 0, 2, 0, 2, 1, 0, 2, 2, 3, 0, 2, 0, 2])]
    
    test = [array([0, 0, 0, 3, 0, 3, 2, 2, 1, 1, 2, 0, 2, 3, 0, 2, 2, 2, 2, 3, 3, 2,
                2, 2, 2, 2, 2, 1, 0, 3, 2, 2, 0, 2, 2, 3, 2, 0, 0, 0, 0, 0, 2, 2,
                2, 1, 0, 0, 0, 2, 2, 0, 2, 0, 2, 1, 0, 2, 2, 3, 0, 2, 0, 2])]
    
    flat_pred = [item for sublist in pred for item in sublist]
    flat_test = [item for sublist in test for item in sublist]
    
    print(classification_report(flat_pred,flat_test))
    

    【讨论】:

    • 已经是平的了,去掉外面的[]。即pred = array([0, 0, ..., ]).
    猜你喜欢
    • 2016-06-25
    • 2012-09-18
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2011-05-24
    • 1970-01-01
    • 1970-01-01
    • 2012-09-03
    相关资源
    最近更新 更多