python - 添加无值总是给出 0
问题描述
我想创建一个函数,将矩阵中的列中的数字相加并输出由总和组成的向量。但是,如果矩阵中有“无”值,则输出向量会自动获得该列的“无”值。我无法弄清楚如何为“无”值做部分。
我尝试了以下代码。
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]]
解决方案
正如我常说的,您应该将矩阵(数学抽象)与其实现(a list
of 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
为 a set
,它允许恒定时间查找,但实际转换为 aset
是线性时间,并且由于我们只对每一列进行一次迭代,我认为它不会更快。
推荐阅读
- apache-camel - 如何在 apache camel 中发送空响应以进行休息呼叫
- ssl - 连接到生产者时出错:错误:ssl.certificate.location 失败
- opencv - opencv:显示图像并等待变量更改,而不是等待按键
- db2 - 如何更改 SYSIBMADM.PRIVILEGES 表中的 GRANTABLE?
- python - 在烧瓶中使用 SQL alchemy 将数据插入 Postgres
- json - 使用 FLINK 将 JSON 下沉到 Kafka 的最快方法
- python - 数据框转换和字符串连接
- java - 以 zip 格式导入 jar 文件
- azure - 如何使用从链接的 ARM 模板返回的安全对象或安全字符串
- javascript - 比较两个小于大于的时间变量