用Python中的列键和行键创建2d数组

2024-10-03 04:30:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用Python创建这个数据结构: 2-d array structure

必须有列键行键,我稍后将使用它们。 列键和行键是随机数。在

现在我有了这个代码:

import random

cols, rows = 5, 5 
Matrix = [[0 for x in range(cols)] for y in range(rows)]

set_col = 0
for row in Matrix:
    row[set_col] = random.randint(1,2)

columnKeys = random.sample(range(1,5), 4)
Matrix[0] = columnKeys

for row in Matrix:
    print(row)

输出:

^{pr2}$

这不是我想要的。现在每个单元格的值都是零。但稍后它会有一些相关的数据,我将使用这些数据以及对应的行和列键。我不知道如何正确地组织这个数据结构,这样我就可以将单元格值与相应的行/列键一起使用。在


如何在没有Pandas和Numpy的情况下使用列和行键?在


Tags: 数据in数据结构forrangecolrandommatrix
2条回答
import random

COLS, ROWS = 5, 5 
Matrix = [[0 for x in range(COLS)] for y in range(ROWS)]

set_col = 0
for row in Matrix:
    row[set_col] = random.randint(1,2)

columnKeys = random.sample(range(1,5), 4)
Matrix[0] = [0] + columnKeys

for row in Matrix:
    print(row)

输出

^{pr2}$

这取决于你想要什么。在

最好的方法可能是使用嵌套列表,而不是使用字典。既然您提到了pandas,pandas DataFrame对象有一个^{}函数,该函数将数据帧转换为字典,并且根据您的喜好有几个选项。在

我从您的示例中看到,您正在尝试创建具有重复索引的数据结构。这里最好的选择是使用通过运行df.to_dict("split")创建的结构。在

假设您的数据帧(df)如下所示:

      3  1  2  4
   2  0  0  0  0
   1  0  0  0  0
   2  0  0  0  0
   1  0  0  0  0

跑步`数据到字典(“分割”)将执行以下操作:

^{pr2}$

在这个场景中,以及在@Makiflow所示的场景中访问数据是很棘手的。即使在Pandas中,数据帧上有重复的索引或列也会使操作更有趣。在本例中,选择df['data'][3][1]将选择data键所包含的第三个列表中的第二个元素。这实际上是选择矩阵的第4行和第2列。如果你想通过列名称来引用项目,就必须多做一些腿部工作。在

您可以运行col_num = d['columns'].index(3),它将为您提供元素3的索引值,但执行d['index'].index(2)操作将始终为0,即使要在索引3处选择2。{cd8>返回第一个条件的值,因为该条件与第一个条件的值匹配。当然,您可以简单地通过(col,row)索引元组进行选择,但这样做首先会破坏列名称和索引值的目的。在

如果要在不使用pandas的情况下生成此结构,可以运行: 列,行=5,5 列=[随机.randint(0,COLS)对于范围内的(COLS)] 行=[随机.randint(1,2)对于范围内的(行)]

d = {"columns": columns,
     "index":   rows,
     "data":    [[0 for _ in range(COLS)] for _ in range(ROWS)]
    }

IMHO-一个更好的解决方案实际上是强制数据结构具有唯一的索引和列值。to_dict()的默认输出将输出一个非常简单的字典:

d = df.to_dict() # also the same as df.to_dict("dict")
{
  1: {1: 0, 2: 0}, 
  2: {1: 0, 2: 0}, 
  3: {1: 0, 2: 0}, 
  4: {1: 0, 2: 0}
}

在这种配置中,字典的每个键都是列的名称。这些键中的每一个都指向另一个表示该列中信息的二进制数-每个键都是一个索引值,后跟一个值。在

这很可能是最直观的,因为如果您想在名为的索引1的列中获得名为3的值,您可以:

   d = df.to_dict()
   d[3][1]
   # 0

无需使用Pandas即可创建此数据结构:

COLS, ROWS = 5,5 
rows = [i for i in range(ROWS)]
columns = [i for in range(COLS)]
{c : {i:0 for i in rows} for c in columns}
# {
#  0: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
#  1: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
#  2: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
#  3: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
#  4: {0: 0, 1: 0, 2: 0, 3: 0, 4: 0}
# }

它实际上取决于你所拥有的约束/需求。在

相关问题 更多 >