对称矩阵问题 - 附加到列表
Issue with symmetric matrix - appending to a list
我是 python 的新手,我在使用数组时遇到了问题。
我在使用对称矩阵时遇到问题。由于对称,X[0][6]
与 X[6][0]
相同。我希望能够将所述数组中的所有非零值附加到列表中 - 但是我不想在对角线上包含元素,也不想在对角线的一侧包含重复的元素。例如,我只想追加 X[0][6]
而不是 X[6][0]
.
二维数组如下:
X = [[9, 0, 0, 1, 0, 0, 6, 0],
[0, 4, 0, 0, 0, 0, 0, 1],
[0, 0, 9, 0, 4, 0, 0, 0],
[1, 0, 0, 3, 0, 0, 0, 1],
[0, 0, 4, 0, 8, 0, 0, 3],
[0, 0, 0, 0, 0, 4, 0, 0],
[6, 0, 0, 0, 0, 0, 9, 2],
[0, 1, 0, 1, 3, 0, 2, 8]]
我试过这样的 for 循环:
non_zero_entries = []
for i in X:
for j in i:
if j > 0:
non_zero_entries.append(j)
然而,当我这样做时,由于数组对称性的性质,我得到以下输出,它不仅有对角线,还有矩阵中的重复项:
Out: [9, 1, 6, 4, 1, 9, 4, 1, 3, 1, 4, 8, 3, 4, 6, 9, 2, 1, 1, 3, 2, 8]
理想情况下,我需要能够将我的矩阵转换成这样,以便对角线和另一边变为 0。
ideal_X = [[0, 0, 0, 1, 0, 0, 6, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 4, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 2],
[0, 0, 0, 0, 0, 0, 0, 0]]
这将给出我需要的输出:
Out: [1, 6, 1, 4, 1, 3, 2]
我如何将我的矩阵转换为我提供的矩阵,或者是否有更简单的方法来使用初始矩阵获得我想要的输出?
您编写了两个嵌套的 for
循环来遍历矩阵的元素,这是一个正确的想法。外层的 for
循环遍历矩阵的每一行,这已经是正确的;您只需要更改内部 for
循环,这样它就不会遍历行中的每个元素,而是仅遍历对角线一侧的元素。
如果您不关心从对角线的哪“边”(上边或下边)提取非零元素,从 下边 获取它们最简单对角线的一侧,通过这样做:
for row_num in range(len(X)):
for col_num in range(row_num):
if X[row_num][col_num] > 0:
non_zero_entries.append(X[row_num][col_num])
请注意,我们没有使用“for-each”循环(其中循环变量是每一整行),而是使用带有范围的 for 循环,其中循环变量是一个数字。这具有等效的行为(X[row_num]
与原始代码中的 i
相同),但允许我们有一个变量来计算循环当前所在的行。这个数字 row_num
等于行内的索引(列号),即“对角线”条目。因此,内部 for
循环可以使用以 row_num
结束的范围,而不是 len(X[row_num])
,以仅迭代从 0 到“对角线”条目的条目。
如果您特别想要来自对角线 上部 侧的条目,则内部 for
循环的范围需要稍微复杂一些:
for row_num in range(len(X)):
for col_num in range(row_num+1, len(X[row_num])):
if X[row_num][col_num] > 0:
non_zero_entries.append(X[row_num][col_num])
在此代码中,range(row_num+1, len(X[row_num]))
为内部 for
循环生成一个范围,该范围从“对角线”条目之后的条目开始,到行尾结束。
我是 python 的新手,我在使用数组时遇到了问题。
我在使用对称矩阵时遇到问题。由于对称,X[0][6]
与 X[6][0]
相同。我希望能够将所述数组中的所有非零值附加到列表中 - 但是我不想在对角线上包含元素,也不想在对角线的一侧包含重复的元素。例如,我只想追加 X[0][6]
而不是 X[6][0]
.
二维数组如下:
X = [[9, 0, 0, 1, 0, 0, 6, 0],
[0, 4, 0, 0, 0, 0, 0, 1],
[0, 0, 9, 0, 4, 0, 0, 0],
[1, 0, 0, 3, 0, 0, 0, 1],
[0, 0, 4, 0, 8, 0, 0, 3],
[0, 0, 0, 0, 0, 4, 0, 0],
[6, 0, 0, 0, 0, 0, 9, 2],
[0, 1, 0, 1, 3, 0, 2, 8]]
我试过这样的 for 循环:
non_zero_entries = []
for i in X:
for j in i:
if j > 0:
non_zero_entries.append(j)
然而,当我这样做时,由于数组对称性的性质,我得到以下输出,它不仅有对角线,还有矩阵中的重复项:
Out: [9, 1, 6, 4, 1, 9, 4, 1, 3, 1, 4, 8, 3, 4, 6, 9, 2, 1, 1, 3, 2, 8]
理想情况下,我需要能够将我的矩阵转换成这样,以便对角线和另一边变为 0。
ideal_X = [[0, 0, 0, 1, 0, 0, 6, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 4, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 1],
[0, 0, 0, 0, 0, 0, 0, 3],
[0, 0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0, 2],
[0, 0, 0, 0, 0, 0, 0, 0]]
这将给出我需要的输出:
Out: [1, 6, 1, 4, 1, 3, 2]
我如何将我的矩阵转换为我提供的矩阵,或者是否有更简单的方法来使用初始矩阵获得我想要的输出?
您编写了两个嵌套的 for
循环来遍历矩阵的元素,这是一个正确的想法。外层的 for
循环遍历矩阵的每一行,这已经是正确的;您只需要更改内部 for
循环,这样它就不会遍历行中的每个元素,而是仅遍历对角线一侧的元素。
如果您不关心从对角线的哪“边”(上边或下边)提取非零元素,从 下边 获取它们最简单对角线的一侧,通过这样做:
for row_num in range(len(X)):
for col_num in range(row_num):
if X[row_num][col_num] > 0:
non_zero_entries.append(X[row_num][col_num])
请注意,我们没有使用“for-each”循环(其中循环变量是每一整行),而是使用带有范围的 for 循环,其中循环变量是一个数字。这具有等效的行为(X[row_num]
与原始代码中的 i
相同),但允许我们有一个变量来计算循环当前所在的行。这个数字 row_num
等于行内的索引(列号),即“对角线”条目。因此,内部 for
循环可以使用以 row_num
结束的范围,而不是 len(X[row_num])
,以仅迭代从 0 到“对角线”条目的条目。
如果您特别想要来自对角线 上部 侧的条目,则内部 for
循环的范围需要稍微复杂一些:
for row_num in range(len(X)):
for col_num in range(row_num+1, len(X[row_num])):
if X[row_num][col_num] > 0:
non_zero_entries.append(X[row_num][col_num])
在此代码中,range(row_num+1, len(X[row_num]))
为内部 for
循环生成一个范围,该范围从“对角线”条目之后的条目开始,到行尾结束。