2016-05-16 2 views
0

У меня есть двумерная матрица matrixK. Например, это может быть что-то вродеУдалить столбцы из матрицы в соответствии с ее индексом

matrixK = [[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]] 

Мне нужно удалить некоторые столбцы матрицы, и эти столбцы должны быть выбраны в соответствии с рисунком, который зависит от их индекса в виде столбцов. Других слов,

for i in range(number_of_columns) 
    if (i satisfy a certain condtion): 
     column[i] needs to be deleted. 

и как конечный результат мне нужно, чтобы получить ту же начальную matrixK, лишенную колонн, которые удовлетворяют условие. Каков наилучший питонический способ сделать это?

Для примера, со ссылкой на matrixK, определенной выше в качестве примера, давайте рассмотрим

for i in range(5): 
     if (i%2==0): 
      column[i] needs to be deleted 

, которые должны удалить столбцы 2 и 4.

+0

было бы неплохо, чтобы поделиться тем, что вы уже пробовали. Помните, что SO не является службой записи кода. –

+0

Условие 'i% 2 == 0' удалит столбец 0, а также 2 и 4. Это связано с тем, что ndexing в Python (и многих других языках компьютера) начинается с 0. – martineau

ответ

0

Это можно сделать двумя различными способами в зависимости от того, нужно ли удалить столбец на месте в исходной матрице или просто заменить его на новый. Пример каждого из способов показан ниже.
Обратите внимание, что ни одна строка матрицы не должна быть одинаковой длины.

# in-place removal of column in matrix 

matrixK = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] 

for row in matrixK: 
    for i in reversed(range(len(row))): 
     if i % 2 == 0: 
      del row[i:i+1] 

print('matrixK after: {}'.format(matrixK)) 

Или:

# removal of columns in matrix by recreating it 

matrixK = [[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14]] 

matrixK = [[row[i] for i in range(len(row)) if i % 2] for row in matrixK] 

print('matrixK after: {}'.format(matrixK)) 

И выход:

matrixK after: [[1, 3], [6, 8], [11, 13]] 

Дополнительная информация

В интересах полного раскрытия информации, пожалуйста, обратите внимание, что есть и другой способ, чтобы выполнить удаление столбцов, которое включает использование buil t-in zip() Функция, которая очень быстрая.

Код не так читается, как два других, и работает только в том случае, если каждая строка матрицы имеет одинаковую длину, но она быстрее, чем две предыдущие.

matrixK = zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2]) 

Который производит:

matrixK after: [(1, 3), (6, 8), (11, 13)] 

Где каждая строка представляет собой tuple, а не list. Если это проблема, они могут быть превращены в подсписки с помощью:

matrixK = map(list, zip(*[row for i, row in enumerate(zip(*matrixK)) if i % 2])) 

Это замедлить его, но он все еще несколько быстрее, чем первые два метода.

2

Если длина подсписков такие же вы можете использовать zip() функцию в списке понимания, как следующее:

>>> zip(*[j for i, j in enumerate(zip(*matrixK)) if i%2 != 0]) 
[(1, 3), (6, 8), (11, 13)] 

Или вы можете использовать логическое индексирование Numpy ар Лучи:

>>> arr = np.array(matrixK) 
>>> arr[:,np.arange(arr.shape[1])%2 != 0] 
array([[ 1, 3], 
     [ 6, 8], 
     [11, 13]]) 
>>> 
1

Вы можете использовать columnFlag массив для обозначения столбцов, которые должны быть удалены.

columnFlag = {} 
for column in range(number_of_columns): 
    if(satisfiesCondition(column)): 
     columnFlag.add(column) 

Теперь вы можете создать result 2D массив, который имеет такое же количество строк, как matrixK и len(columnFlag) колонны меньше, чем у matrixK.

Скопируйте элементы из matrixK в result, только для столбцов не в columnFlag и вернуть result массив.

1
>>> matrixK[:] = map(lambda y : list(filter(lambda x: y.index(x)%2 != 0, y)), matrixK) 
>>> matrixK 
[[1, 3], [6, 8], [11, 13]] 

Вы можете изменить состояние внутри lambda функции filter в зависимости от того, что вы на самом деле хотите

Смежные вопросы