如果所有列均为0,则用1填充numpy矩阵的特定列

时间:2019-10-15 09:05:45

标签: python arrays numpy

假设我有这个矩阵:

> 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。为什么?

3 个答案:

答案 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