在Python中使用列键和行键创建二维数组

时间:2016-10-24 04:57:13

标签: python python-3.x multidimensional-array nested-lists

我试图在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)

输出:

[3, 1, 2, 4]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]

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

怎么做没有 Pandas Numpy 所以我可以使用列和行键?

2 个答案:

答案 0 :(得分:1)

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)

<强>输出

[0, 3, 1, 2, 4]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]
[2, 0, 0, 0, 0]
[1, 0, 0, 0, 0]

答案 1 :(得分:1)

这取决于你想要什么。

最好的方法可能是来使用嵌套列表,而是使用字典。由于您提到了pandas,因此pandas DataFrame对象具有to_dict函数,可将DataFrame转换为字典,并且根据您的喜好有多种选项。

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

假设您的DataFrame(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

运行`df.to_dict(&#34; split&#34;)将执行此操作:

d = df.to_dict("split")
{
  'columns': [3, 1, 2, 4],
  'data': [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
  'index': [2, 1, 2, 1]
}

在这种情况下访问数据,以及@Makiflow所示的数据是棘手的。即使在Pandas中,在Dataframe上有重复的索引或列也会使操作更有趣。在这种情况下,选择df['data'][3][1]选择data键包含的第三个列表中的第二个元素。这实际上是选择矩阵的第4行和第2列。如果您希望能够通过列名称引用项目,则必须进行更多的工作。

你可以运行col_num = d['columns'].index(3),它会为你提供元素3的索引值,但是d['index'].index(2)总是会给你0,即使你想在索引3选择2。这是因为index()返回与条件匹配的第一个值的索引。当然,你可以简单地通过(col,row)索引元组进行选择,但这首先会破坏列名和索引值的目的。

如果要在没有pandas的情况下生成此结构,可以运行:     COLS,ROWS = 5,5     columns = [random.randint(0,COLS)for _ in range(COLS)]     rows = [random.randint(1,2)for _ in range(ROWS)]

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

恕我直言 - 更好的解决方案实际上是强制您的数据结构具有唯一的索引和列值。 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}
}

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

这可能是最直观的意义,因为如果您希望在名为 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}
# }

它真的取决于你的约束/要求。