簡體   English   中英

使用python生成分層數據

[英]Generate hierarchical data using python

我需要為 MxN 大小(M 個級別,N 個子級別)創建目錄和子目錄結構。 Python中是否有任何Tree數據結構可以幫助我做到這一點?

例子:

輸入:

3 x 2(3 個級別和 3 個級別中的每個級別的 2 個子級別)

輸出:

1

 11
  111
  112
 12
  121
  122

------
2

 21
  211
  212
 22
  221
  222
----
3
 31
  311
  312
 32
  321
  322

有幾種不同的數據結構適用於這樣的應用程序。

我的第一個直覺是使用矩陣的嵌套字典,因為這將為您提供您正在尋找的多級索引行為,並且可以在純 Python 中實現。 由於您建議的數據樹大小為MxN (因此是矩形),您還可以使用pandas.DataFrame ,它支持類似於嵌套字典的行/列索引。 但最終,我認為numpy.ndarray在可擴展性方面合適

不過,我將提供每個示例。

使用純 Python

在純 Python 中,整數的MxN矩陣通常由整數列表的列表表示,其類型提示將是list[list[int]]

具有像2/21這樣的level/sublevel對的級別/子level/sublevel/matrix結構的數據可以由像dict[dict[Matrix]]這樣的結構表示,這將使完整數據結構的類型提示類似於dict[dict[list[list[int]]]]

以下嵌套字典理解將生成建議的結構並包含與您的示例案例中提供的完全相同的數據:

M = 3
N = 2

data = {
    i : {
        10 * i + j : [
            [i, j, k] for k in range(1, N + 1)
        ] for j in range(1, N + 1)
    } for i in range(1, M + 1)
}

使用pprint.pprint可以看到其結果:

>>> from pprint import pprint
>>> pprint(data)
{1: {11: [[1, 1, 1], [1, 1, 2]], 12: [[1, 2, 1], [1, 2, 2]]},
 2: {21: [[2, 1, 1], [2, 1, 2]], 22: [[2, 2, 1], [2, 2, 2]]},
 3: {31: [[3, 1, 1], [3, 1, 2]], 32: [[3, 2, 1], [3, 2, 2]]}}

然后可以通過其級別和子級別索引檢索任何特定矩陣:

>>> data[2][21]
[[2, 1, 1], [2, 1, 2]]

使用pandas.DataFrame

如果您不介意調用第三方庫,您可以進一步將其轉換為pandas.DataFrame並簡化子級索引:

import pandas as pd

M = 3
N = 2

data = {
    i : {
        j : [
            [i, j, k] for k in range(1, N + 1)
        ] for j in range(1, N + 1)
    } for i in range(1, M + 1)
}

df = pd.DataFrame(data)

結果如下:

>>> df
                        1                       2                       3
1  [[1, 1, 1], [1, 1, 2]]  [[2, 1, 1], [2, 1, 2]]  [[3, 1, 1], [3, 1, 2]]
2  [[1, 2, 1], [1, 2, 2]]  [[2, 2, 1], [2, 2, 2]]  [[3, 2, 1], [3, 2, 2]]

其中,使用簡化的子級索引,它的元素矩陣如下:

>>> df[2][1]  # Equivalent to data[2][21] in the pure Python example.
[[2, 1, 1], [2, 1, 2]] 

使用numpy.ndarray

此時,您可能會注意到所討論的數據結構實際上只是MxN矩陣的MxN矩陣。 因此,如果您願意,可以通過從字典推導切換到列表推導並調用numpy將其減少為MxNxMxN 4D 數組:

import numpy as np

M = 3
N = 2

data = [
    [
        [
            [i, j, k] for k in range(1, N + 1)
        ] for j in range(1, N + 1)
    ] for i in range(1, M + 1)
]

data = np.array(data)

在此示例中,會產生以下形狀數組(3, 2, 3, 2)

>>> data
array([[[[1, 1, 1],
         [1, 1, 2]],

        [[1, 2, 1],
         [1, 2, 2]]],


       [[[2, 1, 1],
         [2, 1, 2]],

        [[2, 2, 1],
         [2, 2, 2]]],


       [[[3, 1, 1],
         [3, 1, 2]],

        [[3, 2, 1],
         [3, 2, 2]]]])

對於哪個索引相對於pandas.DataFrame的情況來說是一倍的,因為數組索引從零開始:

>>> data[1][0]  # Equivalent to df[2][1] in the pandas example.
array([[2, 1, 1],
       [2, 1, 2]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM