【问题标题】:How to conditionally select an array in dictionary?如何有条件地选择字典中的数组?
【发布时间】:2020-08-27 12:14:27
【问题描述】:

我有一本格式如下的字典:

  • 键是 0-9。
  • 该值是一个数组,其中包含 4 个参数 (dtype=float)。
  • 对于数组中的每个值都有一个标准(例如,值是否 >1?)。如果一个值不满足其标准,则从字典中删除整个条目。
    • 换句话说:只有数组中的所有 4 个值都满足其各自标准的条目才会移动到新字典中)
{0: array([-1.37979662, 1.2237947 , 1.02293956, 2.84491658]),
 1: array([-1.32019091, 1.17396212, 1.01325119, 2.89558077]),
 2: array([-1.29436374, 0.93597102, 1.06104517, 2.92670774]),
 3: array([-1.24879849, 1.04383302, 1.06866074, 2.41867709]),
 4: array([-1.1299237 , 0.72485214, 1.04738796, 2.16609311]),
 5: array([-1.08398485, 0.96394932, 1.03896677, 2.34082866]),
 6: array([-1.24153984, 0.82464176, 1.08445227, 2.6564374 ]),
 7: array([-1.04296362, 0.52683467, 1.10769773, 2.32662654]),
 8: array([-1.34813309, 0.76031429, 1.01582122, 2.60977459]),
 9: array([-1.20303226, 0.79573596, 1.03138351, 2.41515303])}

感谢任何提示,感谢您的努力。

【问题讨论】:

    标签: python arrays dictionary slice


    【解决方案1】:
    • 对于数组中的每个值都有一个标准(例如,值是否 >1?)
      • 示例中的所有键都不符合标准,因此我更新了data[9] 以达到此目的。
    • 以下dict comprehension 满足仅包含key: value 对的条件,其中np.array 中的所有值都是>1
    • .all() 是一个内置的python函数
      • np.array([ True, True, True, True]).all() -> True
      • np.array([ False, True, True, True]).all() -> False
    import numpy as np
    
    data = {0: np.array([-1.37979662, 1.2237947 , 1.02293956, 2.84491658]),
            1: np.array([-1.32019091, 1.17396212, 1.01325119, 2.89558077]),
            2: np.array([-1.29436374, 0.93597102, 1.06104517, 2.92670774]),
            3: np.array([-1.24879849, 1.04383302, 1.06866074, 2.41867709]),
            4: np.array([-1.1299237 , 0.72485214, 1.04738796, 2.16609311]), 
            5: np.array([-1.08398485, 0.96394932, 1.03896677, 2.34082866]), 
            6: np.array([-1.24153984, 0.82464176, 1.08445227, 2.6564374 ]),
            7: np.array([-1.04296362, 0.52683467, 1.10769773, 2.32662654]),
            8: np.array([1.34813309, 0.76031429, 1.01582122, -2.60977459]),
            9: np.array([1.20303226, 1.79573596, 1.03138351, 2.41515303])}
    
    # dict comprehension
    data1 = {k: v for k, v in data.items() if (v > 1.0).all()}
    
    print(data1)
    >>> {9: array([1.20303226, 1.79573596, 1.03138351, 2.41515303])}
    

    适用于多种情况

    data2 = {k: v for k, v in data.items() if v[0] > 1 if v[1] > 0 if v[2] > 1 if v[3] < -2}
    
    print(data2)
    
    >>> {8: array([ 1.34813309,  0.76031429,  1.01582122, -2.60977459])}
    

    【讨论】:

      【解决方案2】:

      假设每个值都是一个numpy 数组,您可以一次检查整个数组的条件,因为基本操作是矢量化的。

      {k: v for k, v in data.items() if sum(v > -1.1) == len(v)}
      
      {5: array([-1.08398485,  0.96394932,  1.03896677,  2.34082866]),
       7: array([-1.04296362,  0.52683467,  1.10769773,  2.32662654])}
      

      当您执行array &gt; value 时,它会返回一个布尔数组,我们可以对其求和。如果这个布尔数组的总和是数组的长度,那么我们就知道每个项目都满足了规定的条件。我使用-1.1 来表明它按预期工作,因为此字典中的值都不符合&gt; 1 标准。

      【讨论】:

        【解决方案3】:

        你也可以使用np.where,因为你有一个 numpy 数组:

        import numpy as np
        
        
        my_dict = {0: np.array([-1.37979662, 1.2237947 , 1.02293956, 2.84491658]),
                1: np.array([-1.32019091, 1.17396212, 1.01325119, 2.89558077]),
                2: np.array([-1.29436374, 0.93597102, 1.06104517, 2.92670774]),
                3: np.array([-1.24879849, 1.04383302, 1.06866074, 2.41867709]),
                4: np.array([-1.1299237 , 0.72485214, 1.04738796, 2.16609311]),
                5: np.array([-1.08398485, 0.96394932, 1.03896677, 2.34082866]),
                6: np.array([-1.24153984, 0.82464176, 1.08445227, 2.6564374 ]),
                7: np.array([-1.04296362, 0.52683467, 1.10769773, 2.32662654]),
                8: np.array([-1.34813309, 0.76031429, 1.01582122, 2.60977459]),
                9: np.array([1.20303226, 1.79573596, 1.03138351, 2.41515303])}
        
        new_dict = {}
        for key, value in my_dict.items():
            temp = value if len(value[np.where(value > 1)]) == len(value) else -1
            if not isinstance(temp, int):
                new_dict[key] = temp
        
        # output = {9: array([1.20303226, 1.79573596, 1.03138351, 2.41515303])}
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 1970-01-01
          • 2017-02-24
          • 2014-03-02
          • 1970-01-01
          • 2013-03-17
          • 1970-01-01
          相关资源
          最近更新 更多