【问题标题】:Creating new matrix based on dictionary values and a list根据字典值和列表创建新矩阵
【发布时间】:2018-11-10 04:59:48
【问题描述】:

下面是一个简化的例子:

val = [10,23,45,31,78,43,1,67,82]

indx = [1,4,5,8]
indx2 = [3,6,7]
indx3 = [0,2]

samp = {}
samp[0] = indx
samp[1] = indx2
samp[2] = indx3

假设我有一本字典 (samp),它有两个组:第 0 组和第 1 组。 字典中有向量 val 中的值的索引。

我想通过创建一个 8 X 2 矩阵来根据字典中的给定组提取 val 中的所有值, 我在两列中按索引排序的组和值,所以它看起来像这样:

val  group
10   2
23   0
45   2
31   0
87   0
43   1
1    1
67   0
82   1

我该怎么做?

【问题讨论】:

    标签: python pandas dictionary numpy-ndarray


    【解决方案1】:

    一种获得方法

    [(j, next(k for k,v in samp.items() if i in v)) for i,j in enumerate(val)]
    

    输出:

    [(10, 2),
     (23, 0),
     (45, 2),
     (31, 1),
     (78, 0),
     (43, 0),
     (1, 1),
     (67, 1),
     (82, 0)]
    

    【讨论】:

      【解决方案2】:

      这是一个不使用 pandas 的解决方案,它输出一个 (8,2) numpy 矩阵:

      val = [10,23,45,31,78,43,1,67,82]
      
      indx = [1,4,5,8]
      indx2 = [3,6,7]
      indx3 = [0,2]
      
      indices = [indx, indx2, indx3]
      
      def get_group(x):
          for i,indx_arr in enumerate(indices):
              if x in indx_arr:
                  return i
      
      pairs = [(v,get_group(i)) for i,v in enumerate(val)]
      np.asarray(pairs)
      
      array([[10,  2],
         [23,  0],
         [45,  2],
         [31,  1],
         [78,  0],
         [43,  0],
         [ 1,  1],
         [67,  1],
         [82,  0]])
      

      【讨论】:

        【解决方案3】:

        使用dictionary comprehension反转字典中的键值对,然后使用map

        df = pd.DataFrame(val,columns=['val'])
        d = {value1:key  for key,value in samp.items() for value1 in value}
        df['group'] = df.index.map(d)
        
        print(df)
           val  group
        0   10      2
        1   23      0
        2   45      2
        3   31      1
        4   78      0
        5   43      0
        6    1      1
        7   67      1
        

        print(d)
        {1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
        

        如果值是 numpy 数组怎么办:

        indx = np.array([1,4,5,8])
        indx2 = np.array([3,6,7])
        indx3 = np.array([0,2])
        
        samp = {}
        samp[0] = indx
        samp[1] = indx2
        samp[2] = indx3
        
        print(samp)
        {0: array([1, 4, 5, 8]), 1: array([3, 6, 7]), 2: array([0, 2])}
        
        d = {value1:key  for key,value in samp.items() for value1 in value}
        
        print(d)
        {1: 0, 4: 0, 5: 0, 8: 0, 3: 1, 6: 1, 7: 1, 0: 2, 2: 2}
        

        【讨论】:

        • 谢谢@Sandeep。如果字典中的值是 numpy 数组怎么办?我注意到 .items() 不支持 np.arrays
        • @Sheila 即使值是 numpy 数组检查更新也会起作用。
        猜你喜欢
        • 2012-08-14
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 2020-01-10
        • 2017-04-10
        • 2022-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多