Удаление определенных элементов из матрицы - PullRequest
0 голосов
/ 27 июня 2019

У меня следующая проблема:

У меня есть матрица.Теперь я хочу удалить одну запись в каждой строке матрицы: в строках, которые содержат определенное число (скажем, 4), я хочу удалить запись с этим номером, а в других строках я просто хочу удалить последний элемент.

Например, если у меня есть матрица

    matrix=np.zeros((2,2))
    matrix[0,0]=2
    matrix[1,0]=4
    matrix

, которая дает

2 0

4 0

после удаления должно быть просто

2

0

спасибо за вашу помощь!

1 Ответ

1 голос
/ 27 июня 2019

Итак, предполагая, что в строке может быть только один 4, вам нужно сделать следующее:

  1. перебрать все строки, и если есть четыре, используйте roll, чтобы он сталпоследний элемент
  2. удалить последний столбец

в строках, которые имеют 4, он удалит это 4 и сдвинет оставшиеся после него значения в строках, которые не имеютиметь 4, он удалит последний элемент.

(я позволил себе попытаться с немного большей матрицей, просто чтобы убедиться, что вывод соответствует ожидаемому)

попробуйте это:

import numpy as np


# Actual solution
def remove_in_rows(mat, num):
    for i, row in enumerate(mat):
        if num in row.tolist():
            index = row.tolist().index(num)
            mat[i][index:] = np.roll(row[index:], -1)
    return np.delete(mat, -1, 1)


# Just some example to demonstrate it works
matrix = np.array([[10 * y + x for x in range(6)] for y in range(6)])
matrix[1, 2] = 4
matrix[3, 3] = 4
matrix[4, 0] = 4

print("BEFORE:")
print(matrix)

matrix = remove_in_rows(matrix, 4)

print("AFTER:")
print(matrix)

Вывод:

BEFORE:
[[ 0  1  2  3  4  5]
 [10 11  4 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32  4 34 35]
 [ 4 41 42 43 44 45]
 [50 51 52 53 54 55]]
AFTER:
[[ 0  1  2  3  5]
 [10 11 13 14 15]
 [20 21 22 23 24]
 [30 31 32 34 35]
 [41 42 43 44 45]
 [50 51 52 53 54]]
...