【问题标题】:Python for loop, iterating over values from numpy arrange methodPython for 循环,从 numpy 排列方法中迭代值
【发布时间】:2020-02-20 14:47:49
【问题描述】:

我需要编写代码来测试分类问题的 numpy 截止值数组。要测试的值存储在cutoff_list 变量中。然后,我想将生成的混淆矩阵列表放入字典中。但是,下面的代码只给了我第一个字典条目(第一个测试值的混淆矩阵):

cutoff_list = [np.arange(0,1,0.01)]  # list of test values
dictionary = {}  
for i, v in enumerate(cutoff_list):
    actual = (df.observed)
    predicted = np.where(df.indicator > i, 1, 0)

    df_confusion = confusion_matrix(actual, predicted) / len(df.indicator)   

    dictionary[i] = df_confusion

print(dictionary)

我正在使用的库:

from pandas import Series, DataFrame
import pandas as pd
import numpy as np
from sklearn.metrics import confusion_matrix

这是循环或字典更新步骤的问题吗?我是 Python 新手,对 R 有更多经验,但仍然在这里苦苦挣扎。任何帮助表示赞赏。

【问题讨论】:

    标签: python numpy dictionary for-loop


    【解决方案1】:

    由于您的设置方式,您的 for 循环只运行一次。

    您将 np.arrange(0.1.0.01) 的返回值包含在一个列表中,这会破坏您希望 for 循环运行的方式。您只得到一个值,因为 for 循环只运行一次,因为外部列表只有一项。

    >>> cutoff_list = [np.arange(0,1,0.01)]
    >>> cutoff_list
    [array([0.  , 0.01, ... 0.98, 0.99])]
    >>> type(cutoff_list)
    <class 'list'>
    

    你想得到实际的 numpy 数组:

    >>> cutoff_list = np.arange(0,1,0.01)
    >>> cutoff_list
    array([0.  , 0.01, ... 0.98, 0.99])
    >>> type(cutoff_list)
    <class 'numpy.ndarray'>
    

    cutoff_list = [np.arange(0,1,0.01)] 行更改为cutoff_list = np.arange(0,1,0.01),看看是否能解决您的问题。

    我还想你想在这一行中使用v 而不是i

        predicted = np.where(df.indicator > i, 1, 0)
    

    因为i 将只保存您用作dict 键的枚举值,而v 将保存来自cutoff_list 的值。

    【讨论】:

    • 谢谢,从某种意义上说,这有助于现在循环运行范围,但 df_confusion 的值在每次迭代中保持不变(第一个值)——字典是否被正确更新?看来这可能是个问题
    • 如果没有您的代码使用的值,那将更难调试,但是您是否按照我的回答中的建议更新了定义 predicted 的行?如果没有,请将行更改为predicted = np.where(df.indicator &gt; v, 1, 0),看看会发生什么。
    • 没关系!这是我使用错误的概率列 - 非常感谢您的帮助
    猜你喜欢
    • 2012-11-28
    • 2012-06-27
    • 2023-03-05
    • 1970-01-01
    • 2013-01-16
    • 1970-01-01
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多