首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用python生成分层数据

使用python生成分层数据
EN

Stack Overflow用户
提问于 2022-06-02 19:14:45
回答 1查看 119关注 0票数 -1

我需要为MxN大小(M级,N级)创建目录和子目录结构.Python中是否有任何树数据结构可以帮助我做到这一点?

示例:

输入:

3x2(3个级别和2个分级别,每个3个级别)

输出:

代码语言:javascript
复制
1

 11
  111
  112
 12
  121
  122

------
2

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

回答 1

Stack Overflow用户

发布于 2022-06-02 21:05:05

对于这样的应用程序,有几个不同的数据结构可以工作。

我的第一个直觉是使用嵌套的矩阵字典,因为这将给您提供您要寻找的多层次索引行为,并且可以用纯Python实现。由于建议的数据树的大小是MxN (因此是矩形的),所以也可以使用pandas.DataFrame,它支持类似嵌套字典的行/列索引。但最终,我认为numpy.ndarray就是在可伸缩性方面更适合

不过,我将提供每一个例子。

使用纯Python

在纯Python中,整数的MxN矩阵通常由整数列表表示,其类型提示list[list[int]]

level/sublevel/matrix这样具有level/sublevel对(如2/21 )的数据可以用像dict[dict[Matrix]]这样的结构来表示,这将使类型提示对完整的数据结构产生类似于dict[dict[list[list[int]]]]的提示。

以下嵌套字典理解将生成建议的结构,并包含与示例中提供的数据完全相同的数据:

代码语言:javascript
复制
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看到。

代码语言:javascript
复制
>>> 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]]}}

然后,可以通过其级别和子级别索引检索任何特定的矩阵:

代码语言:javascript
复制
>>> data[2][21]
[[2, 1, 1], [2, 1, 2]]

使用pandas.DataFrame

如果您不介意调用第三方库,则可以进一步将其转换为pandas.DataFrame并简化子级别索引:

代码语言:javascript
复制
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)

其结果如下:

代码语言:javascript
复制
>>> 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]]

它使用简化的子级别索引,给出其元素矩阵如下:

代码语言:javascript
复制
>>> df[2][1]  # Equivalent to data[2][21] in the pure Python example.
[[2, 1, 1], [2, 1, 2]] 

使用numpy.ndarray

此时,您可能会注意到,所讨论的数据结构实际上只是MxN矩阵的一个MxN矩阵。因此,如果您愿意,可以通过从字典理解转换为列表理解和调用MxNxMxN 4D数组将其简化为一个numpy 4D数组。

代码语言:javascript
复制
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)数组

代码语言:javascript
复制
>>> 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情况而言是逐个索引的:

代码语言:javascript
复制
>>> data[1][0]  # Equivalent to df[2][1] in the pandas example.
array([[2, 1, 1],
       [2, 1, 2]])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72481251

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档