【问题标题】:Mapping a list of elements to a range of an element from another list to create unique matrices将元素列表映射到另一个列表中的元素范围以创建唯一矩阵
【发布时间】:2021-06-18 04:42:05
【问题描述】:

我正在尝试“将元素列表映射到另一个列表中的元素范围以创建唯一矩阵。”让我用一张图来解释。

Kickstart-inspired question

我希望这是有道理的。

这是受到 Google Kickstart 比赛的启发,这意味着这不是比赛完全要求的问题。

但我想到了这个问题,觉得值得探讨。

但我被自己困住了,无法继续前进。

这是我的代码,这显然不是正确的解决方案。

values = input("please enter your input: ")
values = values.split()
values = [int(i) for i in values]
>>> please enter your input: 2 4 3 1 0 0 1 0 1 1 0 0 1 1 0 6 4 1 0 0 0 1 0 0 1 1 1 1 1 1 0 1 0 1 0 1 0 1 1 1 0

rows_columns = []
matrix = []
for i in values:
  if i > 1:
    rows_columns[:1].append(i) # The "2" at the very beginning indicates how many matrices should be formed
  elif i <= 1:
    matrix.append(i)
 
 rows_columns[:1]
 >>> [4, 3, 6, 4]

 matrix_all = []
 for i in range(1, len(rows_columns)):
   matrix_sub = []
   for j in range(rows_columns[i]):
     matrix_sub.append(matrix[j])
     if matrix_sub not in matrix_all:
       matrix_all.append(matrix_sub)
 
  >>> [[1, 0, 0, 1], [1, 0, 0], [1, 0, 0, 1, 0, 1], [1, 0, 0, 1]]

我真的想知道嵌套循环是否是解决这个问题的好主意。这是我最近几个小时能想到的最好方法。我想得到的最终结果如下所示。

Final expected output

鉴于有关于一个列表上的矩阵应该有多少行和列的信息,以及在另一个列表上形成矩阵的足够数量的元素,映射(或创建)两者的解决方案是什么根据列表上的维度信息,从另一个列表中提取矩阵?

希望清楚,不明白的时候告诉我。

谢谢!

【问题讨论】:

  • 你考虑过 numpy 吗?如果我理解您想要实现的目标,它将一个平面数字列表转换为一组二维矩阵。使用 numpy 应该非常简单且高效。
  • 是的,我知道,但我不想使用任何内部/外部模块来解决这个问题。我不记得你说的numpy方法了,也许我可以搜索一下。但我不知道使用 numpy 是否真的显示了我的编程能力。如果您要自己解决它,您有什么建议吗?你会像我尝试的那样使用嵌套循环还是使用其他逻辑?
  • 无需重新发明轮子。高效总是很重要的,因为 Python 有许多高效的模块,知道何时以及如何使用正确的模块,将使您节省时间和精力,并显示您在这方面的效率。

标签: python matrix mapping


【解决方案1】:

在不使用 numpy 的情况下,这是一个可行的解决方案,基于在您的代码 sn-p 中找到的输入,以及最终预期结果链接中列出的预期结果:

values = [2, 4, 3, 1, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 6, 4, 1, 0, 0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1,
      0, 1, 0, 1, 0, 1, 1, 1, 0]

v_idx = 1
"""
As per example, the number of matrices desired is found in the first input list element.
In the above values list, we want 2 matrices. The for loop below therefore executes exactly 2 times
"""
for matrix_nr in range(values[0]):
    # The nr of rows and nr of columns are the next two elements in the values list
    nr_rows = values[v_idx]
    nr_cols = values[v_idx + 1]
    # Calculate the start index for the next matrix specifications
    new_idx = v_idx+2+(nr_rows*nr_cols)
    # Slice the values list to extract the values for the current matrix to format
    sub_elements = values[v_idx+2: new_idx]
    matrix = []
    # Append elements to the matrix by slicing values according to nr_rows and nr_cols
    for r in range(nr_rows):
        start_idx = r*nr_cols
        end_idx = (r+1)*nr_cols
        matrix.append(sub_elements[start_idx:end_idx])
    print(matrix)
    v_idx = new_idx

这给出了预期的结果:

[[1, 0, 0], [1, 0, 1], [1, 0, 0], [1, 1, 0]]
[[1, 0, 0, 0], [1, 0, 0, 1], [1, 1, 1, 1], [1, 0, 1, 0], [1, 0, 1, 0], [1, 1, 1, 0]]

如前所述,numpy 很可能被用来提高效率。

【讨论】:

  • 哇,这实际上超出了我的预期。难怪你说使用 Numpy 是有效的。现在我想问你,你认为什么时候不使用或使用像 NumPy 这样的内部模块来解决问题是合适的?如果这是处理正确输入所需问题的一部分,因此这不是最终要求,那么您认为使用内部模块解决这部分问题是否更好?您是否有提示何时使用或不使用 Python 中可用的内部模块?使用内置模块总是不好看吗?
  • 真的取决于您的要求和您正在处理的数据的大小。 numpy 旨在非常高效地格式化和处理矩阵(就像 C 代码一样高效)。在您给出的示例中,这可能是一种矫枉过正,但如果您有数千个矩阵要格式化和处理,那么 numpy 肯定是要走的路。 numpy 是一个非常常用的库,尤其是在机器学习和数学应用程序中。
  • @Conan 如果/对答案感到满意,请标记为已回答或投票。谢谢
  • 哦,是的!我赞成你的回答。非常感谢!绝对没有必要重做所有已完成的工作。从巨人的肩膀开始总是很重要的。我们倾向于认为这是理所当然的,但使用他们留给我们的东西并没有错。谢谢,马洛提醒我这一点。我绝对知道 NumPy 在机器学习中的用处。非常感谢,菲利普的帮助!虽然这个问题是关于如何根据另一个列表的信息映射矩阵,但我从你们那里学到了要记住的更重要的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-17
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 2020-04-13
相关资源
最近更新 更多