Заполните определенный столбец пустой таблицы с 1, если все столбцы 0 - PullRequest
1 голос
/ 15 октября 2019

Допустим, у меня есть эта матрица:

> 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

Я хочу заполнить первый столбец мата значением 1, если все столбцы в итерированной строке равны 0.

Так что матбудет выглядеть так:

> 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 ]

2 голосов
/ 15 октября 2019

Альтернативным решением является оценка строки с 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 голосов
/ 15 октября 2019
for i in range(len(mat)):
  for j in range(5):
      if (mat[i][j]!=1):
          mat[i][0]=1

Это не работает, потому что для первого столбца будет установлено значение 1, если в каком-либо столбце есть ноль. Вы хотите установить для первого столбца значение 1, если все столбцы имеют значение 0

. Это будет работать

for i in range(len(mat)):
  for j in range(5):
      if (mat[i][j]==1):
          break;
      mat[i][0] = 1

Кроме того, гораздо лучшим решением будет использование суммы

for i in range(len(mat)):
  if (sum(mat[i]) == 0):
     mat[i][0] = 1
.
0 голосов
/ 15 октября 2019
mat[mat.sum(axis=1).astype(np.bool).flat] = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...