【问题标题】:Flatten numpy array and keep index values展平 numpy 数组并保留索引值
【发布时间】:2021-09-14 19:00:47
【问题描述】:

假设我有以下矩阵,pandasnumpy

A = np.array([[1,2,3],[4,5,6],[7,8,9]])

>>> array([[1, 2, 3],
          [4, 5, 6],
          [7, 8, 9]])

我正在寻找一种方法来将此数组重塑为 1D 并将该单元格的索引保留为列名,以便如果将上述内容展平,结果将是这样的:

>>> array([['i1j1', 'i1j2', 'i1j3', 'i2j1', 'i2j2', 'i2j3', 'i3j1', 'i3j2','i3j3'],
          ['1', '2', '3', '4', '5', '6', '7', '8', '9']], dtype='<U4')

非常感谢。

【问题讨论】:

    标签: python pandas numpy matrix


    【解决方案1】:

    这是另一种方式:

    b = (pd.DataFrame(A)
         .rename(lambda x: 'i{}'.format(x+1))
         .rename(lambda x: 'j{}'.format(x+1),axis=1)
         .stack())
    b = b.set_axis(b.index.map(''.join)).to_frame().T
    

    【讨论】:

    • 我喜欢你使用 set_axis 和 map join 来扁平化 multiindex 作为数据框的链式方法。 +1
    【解决方案2】:

    正如您所注意到的,有一种非常直观的方法可以计算展平数组的索引。我们可以使用np.meshgrid 来利用它。

    xv, yv = np.meshgrid(np.arange(A.shape[0]), np.arange(A.shape[1])) 
    indices = np.stack(( yv.flatten(), xv.flatten()), axis=1)
    

    输出

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

    编辑:

    要获得示例中的确切格式,请尝试:

    xv, yv = np.meshgrid(np.arange(A.shape[0]) + 1, np.arange(A.shape[1]) + 1)  
    rows = np.char.add('i', yv.flatten().astype(str)) 
    cols = np.char.add('j', xv.flatten().astype(str))
    indicies = np.char.add(rows,cols)
    np.stack((indicies, A.flatten()))
    

    返回

    array([['i1j1', 'i1j2', 'i1j3', 'i2j1', 'i2j2', 'i2j3', 'i3j1', 'i3j2', 'i3j3'],
           ['1', '2', '3', '4', '5', '6', '7', '8', '9']], dtype='<U24')
    

    【讨论】:

      【解决方案3】:

      试试:

      df = pd.DataFrame(A, 
                        columns=[f'j{j+1}' for j in range(A.shape[1])], 
                        index=[f'i{i+1}' for i in range(A.shape[0])]).stack()
      df.index = [f'{i}{j}' for i, j in df.index]
      df_out = df.to_frame().T
      df_out
      

      输出:

         i1j1  i1j2  i1j3  i2j1  i2j2  i2j3  i3j1  i3j2  i3j3
      0     1     2     3     4     5     6     7     8     9
      

      【讨论】:

        猜你喜欢
        • 2021-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-13
        • 2018-07-24
        • 2019-06-09
        • 1970-01-01
        • 2013-06-29
        相关资源
        最近更新 更多