【问题标题】:I have a dictionary stored as numpy array a typical key is in the format of我有一个存储为 numpy 数组的字典,典型的键格式为
【发布时间】:2017-02-15 08:33:35
【问题描述】:

我有一个存储为 numpy 数组的数据字典。字典中的典型键的格式为:

('Typical Key', {'a': 100 'b': 'NaN', 'c': 'NaN', 'e': 360300, 'f': 8308552, 'g': 'NaN', 'h': 3576206, 'i': True, 'j': 'NaN', 'k': 'NaN', 'l': 'NaN', 'm': 'blah.blah@blah.com', 'x': 'NaN'})

我正在尝试查找字典中的哪个键包含具有最大值的元素,以便识别我可以在图表上看到的数据集中的异常值。我通过教程知道数据点的关键应该是什么(我知道答案)

我已经尝试了几种方法来做到这一点,但我一直得到一个意想不到的结果——我的代码一直基于使用max() 函数。例如看下面的例子:

inverse = [(value, key) for key, value in data_dict.items()]
print max(inverse)[1]

xx = max(data_dict, key=lambda i: data_dict[i])

print xx

import operator 
result = max(data_dict.iteritems(), key=operator.itemgetter(1))[0]
print result

我有一种感觉,我没有在看元素,这就是问题所在。任何帮助表示赞赏!

【问题讨论】:

  • 我有一个存储为 numpy 数组的数据字典。看不到numpy 不知道在哪里
  • 您发布的数据会产生什么输出?
  • import pickle import sys import matplotlib.pyplot import numpy as np sys.path.append("../tools/") from feature_format import featureFormat, targetFeatureSplit Numpy 在文件头,但我考虑到我已经说过这是一个 Numpy 数组,我认为分享并不重要

标签: python pandas numpy dictionary regression


【解决方案1】:
import sys
Max = -sys.maxint
best_key = None
for k, v in data_dict:
    # k refers to each 'typical key'
    inner_dict = v
    for key, value in inner_dict.items():
        if isinstance(value, int) and Max < value:
            Max = value
            best_key = key
print best_key

【讨论】:

  • 试一试@gwhiz,但我得到了一个错误 ValueError: too many values to unpack 我可以把它追到堆栈上的兔子洞!
【解决方案2】:

O.K 通过适当地调整代码对其进行排序 - 可能是因为我没有明确表达我想要正确地做的事情 不得不稍微调整代码,但这确实有效 - 我需要努力了解为什么我的其他代码没有返回预期值

import sys
Max = -sys.maxint
best_key = None
    for k, v in data_dict.iteritems():
    # k refers to each 'typical key'
  inner_dict = v
      for key, value in inner_dict.iteritems():
          if isinstance(value, int) and Max < value:
          Max = value
          best_key = k`

【讨论】:

    【解决方案3】:

    使用您的示例字典:

    In [684]: dd
    Out[684]: 
    {'a': 100,
     'b': 'NaN',
     'c': 'NaN',
     'e': 360300,
     'f': 8308552,
     'g': 'NaN',
     'h': 3576206,
     'i': True,
     'j': 'NaN',
     'k': 'NaN',
     'l': 'NaN',
     'm': 'blah.blah@blah.com',
     'x': 'NaN'}
    

    我可以轻松提取值列表 - 但使用这些字符串,我无法执行 max

    In [685]: list(dd.values())
    Out[685]: 
    ['NaN',
     'blah.blah@blah.com',
     3576206,
     'NaN',
     8308552,
     'NaN',
     100,
     'NaN',
     'NaN',
     360300,
     'NaN',
     True,
     'NaN']
    

    所以你发现我必须先过滤掉ints

    In [687]: max([i for i in dd.values() if isinstance(i,int)])
    Out[687]: 8308552
    

    或者max的候选元组列表:

    In [692]: [(v,k) for k,v in dd.items() if isinstance(v,int)]
    Out[692]: [(3576206, 'h'), (8308552, 'f'), (100, 'a'), (360300, 'e'), (True, 'i')]
    

    并使用lambda key 取最大值:

    In [693]: max([(k,v) for k,v in dd.items() if isinstance(v,int)], key=lambda x:x[1])
    Out[693]: ('f', 8308552)
    

    =============

    来自您的评论(为清晰起见重新格式化)

    import pickle 
    import sys 
    import matplotlib.pyplot 
    import numpy as np 
    sys.path.append("../tools/") 
    from feature_format import featureFormat, targetFeatureSplit
    #added
    ### read in data dictionary, convert to numpy array 
    data_dict = pickle.load(open("../final_project/final_project_dataset.pkl", "r") ) 
    features = ["salary", "bonus"] 
    data = featureFormat(data_dict, features) 
    print type(data)
    

    您可以导入numpy,但样本数据不是数组。你给了我们一个包含字典的元组。而且您的代码都是 Python 列表和字典工作,没有使用 numpy

    【讨论】:

    • 对不起,我也应该发布这个 ### 读取数据字典,转换为 numpy 数组 data_dict = pickle.load( open("../final_project/final_project_dataset.pkl", "r") ) features = ["salary", "bonus"] data = featureFormat(data_dict, features) 打印类型(data)`
    猜你喜欢
    • 2021-06-21
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 2020-02-12
    • 2013-01-17
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多