我想创建一个函数,将矩阵中各列的数字相加,并输出由和构成的向量。但是,如果矩阵中存在“ None”值,则输出向量将自动为该列获取“ None”值。我无法弄清楚如何为“无”值做部分。
我尝试了以下代码。
def sum_matrix (matrix):
#
# | 1 2 3 |
# | 1 2 3 |
# | 1 2 3 | -> |4 8 12|
# | 1 2 3 |
# _________
# 4 8 12
vektor = [[0] for i in range(0,len(matrix[0]))]
for j in range(0, len(matrix[0])): #rows 0-3 4
buffer = 0
for i in range(0, len(matrix)): #columns 3
if matrix[i][j] !=None:
buffer = buffer + matrix[i][j]
#vektor[j][0] = buffer
elif matrix[i][j] ==None:
vektor[j][0] = None
vektor[j][0] = buffer
return vektor
print (sum_matrix ([[0,0,0],[0,0,1],[0,1,0],[0,0,0]]))
print (sum_matrix ([[0,0,0],[0,None,1],[0,1,None],[0,0,0]]))
对于sum_matrix ([[0,0,0],[0,0,1],[0,1,0],[0,0,0]])
,我得到[[0],[1],[1]]
很好。
对于sum_matrix ([[0,0,0],[0,None,1],[0,1,None],[0,0,0]])
,即使我应该得到[[0],[1],[1]]
[[0],[None],[None]]
答案 0 :(得分:0)
当matrix [i] [j] == None时,您不需要存储在缓冲区None中,因为在退出内循环时要更改vektor的值,所以 vektor始终取值缓冲区
def sum_matrix (matrix):
#
# | 1 2 3 |
# | 1 2 3 |
# | 1 2 3 | -> |4 8 12|
# | 1 2 3 |
# _________
# 4 8 12
vektor = [[0] for i in range(0,len(matrix[0]))]
for j in range(0, len(matrix[0])): #rows 0-3 4
buffer = 0
for i in range(0, len(matrix)): #columns 3
if matrix[i][j] !=None:
buffer = buffer + matrix[i][j]
#vektor[j][0] = buffer
elif matrix[i][j] ==None:
buffer = None
break
vektor[j][0] = buffer
return vektor
答案 1 :(得分:0)
正如我经常说的,您应该将矩阵(一种数学抽象)与它的实现(list
中的lists
)区分开来。
现在,我们这里基本上是list
中的lists
,其中每个内部list
代表一行,但我们希望将每一列的总和作为附加约束只要包含至少一个None
值,就应该为None
。
我想说,最简单的方法是将list
理解与zip
结合使用,它可以有效地转置矩阵:
def sum_matrix(m):
transposed = zip(*m)
summed = [[sum(col) if None not in col else None]
for col in transposed]
return summed
print(sum_matrix([[0,0,0],[0,0,1],[0,1,0],[0,0,0]]))
print(sum_matrix([[0,0,0],[0,None,1],[0,1,None],[0,0,0]]))
输出:
[[0], [1], [1]]
[[0], [None], [None]]
注意:您也可以将内部list
的理解理解为[None if None in col else sum(col)]
,但我更喜欢把“正常”的情况放在首位。
您还可以将col
转换为set
,这允许进行恒定时间查找,但是实际转换为set
的时间是线性时间,因为我们只遍历每列一次,我认为不会更快。