假设我有这个矩阵:
> mat
index values
0 0 0 0 0 0
1 0 0 0 0 0
2 0 1 0 0 0
3 0 1 0 0 0
4 0 0 0 0 0
5 0 0 0 0 0
6 0 0 1 0 0
7 0 0 1 0 0
8 0 0 0 0 0
如果迭代行中的所有列均为0,我想用值1填充mat的第一列。
所以垫子会像这样:
> mat
index values
0 1 0 0 0 0
1 1 0 0 0 0
2 0 1 0 0 0
3 0 1 0 0 0
4 1 0 0 0 0
5 1 0 0 0 0
6 0 0 1 0 0
7 0 0 1 0 0
8 1 0 0 0 0
这就是我尝试过的:
for i in range(len(mat)):
for j in range(5):
if (mat[i][j]!=1):
mat[i][0]=1
但这在所有列中都放入1。为什么?
答案 0 :(得分:2)
for i in range(len(mat)):
for j in range(5):
if (mat[i][j]!=1):
mat[i][0]=1
这不起作用,因为如果任何列为零,它将第一列设置为1。如果所有列都为0,则要将第一列设置为1
这可以工作
for i in range(len(mat)):
for j in range(5):
if (mat[i][j]==1):
break;
mat[i][0] = 1
此外,更好的解决方案是使用sum
for i in range(len(mat)):
if (sum(mat[i]) == 0):
mat[i][0] = 1
答案 1 :(得分:2)
另一种解决方案是使用numpy.any()
评估行:
for i in range(len(mat)):
mat[i][0] = 0 if np.any(mat[i]) else 1
或者只是没有for循环
mat[:,0] = ~np.any(mat, axis=1)
答案 2 :(得分:0)
mat[mat.sum(axis=1).astype(np.bool).flat] = 1