【问题标题】:How to create a zero matrix without using numpy?如何在不使用 numpy 的情况下创建零矩阵?
【发布时间】:2019-03-03 00:48:55
【问题描述】:

已经看遍了,但如果不是在 numpy 上似乎找不到信息。 需要使用 python 而不是 numpy & 创建一个 3 x 6 零矩阵,以使输出看起来完全像这样:

Matrix 3 by 6 with 0's:
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00

【问题讨论】:

  • 当你说matrix时,你到底是什么意思?在numpy 中已定义。在 Python 中,没有“矩阵”类型。你想要一个列表列表吗?还是一个元组的元组?内部列表应该是行还是列?无论您选择哪一个,访问矩阵的这些切片都会比其他切片更容易(例如,获取特定行比获取列更容易)。
  • 抱歉,如果我没有使用正确的措辞。首先需要创建一个具有行和列的二维列表,ROWS 和 COLS 的常量分别为 3 和 6
  • 尝试:[[str('00')] * 6] * 3,如果您需要 '00',否则:[[0] * 6] * 3
  • 查看相关问题How to number a 2 dimensional list? — 您的问题本质上是一个更简单的版本,因为您希望所有值都相同(零)。
  • @hacker315: 你的建议[[0] * 6] * 3 是人们通常被警告不要做的事情,因为即使它构建了内部列表引用的外部列表,所有内部列表引用都引用了 相同的 内部列表对象。因此,如果对 一个 行进行了修改,则实际上是对 所有 行进行了修改。

标签: python


【解决方案1】:

这行得通:

rows, cols = 3,6
my_matrix = [([0]*cols) for i in range(rows)]

说明:

  1. 表达式([0]*cols)表示由列表表达式构建的列表的每个元素([([0]*cols) for i in range(rows)]中的外方括号)
  2. 该表达式 ([0]*cols) 生成一个一维零列表(与 cols 的值一样多的零)

因此,列表表达式实际上构建了一个一维列表列表,其中每个内部列表都有cols 零。

【讨论】:

  • 谢谢。也会试试这个,看看它是如何工作的。我想学习我的逻辑方法,看看它在 Python 中是如何工作的。
  • 这不是和你警告过的我的建议一样吗?只是好奇..
  • @hacker315 否 - 源头每次都创建一个 new 列表,但您只是多次引用同一个列表。在解释器中尝试你的方法和这个方法,看看如果你修改第一个列表会发生什么。
  • @hacker315:好问题。答案是否定的,这不是一回事。您可以通过编写一个小循环对其进行测试,该循环将为cur_row 的所有值打印id(my_matrix[cur_row])。你会看到id都是不同的。
【解决方案2】:

我假设你知道如何在 python 中创建一个列表:my_list = [0, 0, 0]。要制作列表列表,我们可以将列表定义嵌套在另一个列表中:nested_list = [[0, 0, 0], [0, 0, 0]]。显然你不会想把整个事情写出来,所以我们可以把它抽象成一个函数:

def make_zeros(n_rows: int, n_columns: int):
    matrix = []
    for i in range(n_rows):
        matrix.append([0] * n_columns)
    return matrix

这会创建一个外部列表,然后一次将一个内部列表(“行”)附加到它。无论您的 Python 水平如何,这都是一个非常明确的定义,但如果您愿意,可以使用列表推导来缩短它:

def make_zeros(n_rows: int, n_columns: int):
    return [[0] * n_columns for _ in range(n_rows)]

请注意,这里的内部列表是,因此您可以轻松访问行:

matrix = make_zeros(3, 6)
matrix[0] # the first row

但是,“列”由每一行中的一个元素组成;还没有这些列表,所以如果你想获得第一列,你必须做类似的事情

col0 = [row[0] for row in matrix]

您可以编写一个辅助函数来简化此操作,但很快您就会为所有常见的矩阵/数组运算编写辅助函数,然后您将重新发明numpy 已经做得很好的轮子.

【讨论】:

  • 谢谢。将练习使用该函数并添加常量以查看其工作原理。
  • 如果这回答了您的问题,您可以单击答案左侧的复选标记以接受此答案,并让其他人知道您的问题已得到解决。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-14
  • 2022-09-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多