numpy配列をdataframeに変換する際に、インデックスを付与する方法について


n次元のnumpy配列をdataframeに変換する際、dataframeの1列目には1次元目のインデックス、2列目には2次元目のインデックス、・・・n列目にはn次元目のインデックス、n+1列目に配列の要素、となるようなデータフレームの作成方法をご教示賜りたいと存じます。

今までは、以下のとおり、行数が配列の要素数、列数がn+1列の2次元のnumpy配列を用意しておき、forループをn回繰り返して2次元配列を作成し、dataframeに変換しておりましたが、さすがに10次元くらいになるとインデントも深すぎて飽きてきます。

[code]

    mynp = np.zeros(m1*m2*m3*...*mn, n+1)
    
    for l1 in range(m1):
        for l2 in range(m2):
            for l3 in range(m3):
                 ……
                     for ln in range(mn):
                         mynp[l1*m2*m3*m4***mn,l2*m3*m4****mn,...,ln] = x[l1,l2,...,ln]
    
    mypd = pd.DataFrame(mynp)
    
    
[/code]




`numpy.indices()` を使うことで、以下のようにループ無しにシンプルに実装できるかと思います。

[code]

    idx = np.indices(arr.shape).reshape(arr.ndim, -1)
    ret = np.vstack([idx, arr.reshape(-1)]).T
    
[/code]

<https://docs.scipy.org/doc/numpy/reference/generated/numpy.indices.html>

* * *

以下動作サンプル

[code]

    import numpy as np
    import pandas as pd
    
    arr = np.arange(5*4*3*2).reshape(5,4,3,2)
    idx = np.indices(arr.shape).reshape(arr.ndim, -1)
    ret = np.vstack([idx, arr.reshape(-1)]).T
    df = pd.DataFrame(ret)
    #     0  1  2  3    4
    #0    0  0  0  0    0
    #1    0  0  0  1    1
    #2    0  0  1  0    2
    #3    0  0  1  1    3
    #4    0  0  2  0    4
    #..  .. .. .. ..  ...
    #115  4  3  0  1  115
    #116  4  3  1  0  116
    #117  4  3  1  1  117
    #118  4  3  2  0  118
    #119  4  3  2  1  119
    
[/code]

