Отслеживание оптимальных индексов при уменьшении матрицы на 1x1 на каждой итерации

НАСТРОЙКА

У меня есть диагональная матрица NxN, и я уменьшаю матрицу на 1x1 на каждой итерации.

indices = np.arange(0, np.size(n_n_matrix, 0)).tolist()
for iter in range(0, N-K)
    opt_indices = criterion(n_n_matrix)
    lost_index = [i for i in indices if i not in opt_indices][0]
    n_n_matrix = np.delete(traj_dist_matrix, lost_index, axis=0)
    n_n_matrix = np.delete(traj_dist_matrix, lost_index, axis=1)

Я делаю это до тех пор, пока у меня не будет диагональной матрицы KxK. Как я могу отслеживать неудаленные индексы с точки зрения их положения в исходной матрице NxN?

ОШИБКА

Я терплю неудачу, пытаясь:

lost_indices = [], list_indices_iter = []
>>>loop above<<<
    count_1 = sum(lost_index >= idx for idx in lost_indices_iter)
    count_2 = sum(lost_index + count_1 >= idx for idx in lost_indices_iter) - count_1
    ...
    lost_indices.append(lost_index + count_1 + count_2 ...)
    lost_indices_iter.append(lost_index)
left_opt_indices = [i for i in indices if i not in lost_indices]

СОКРАЩЕННАЯ ПРОБЛЕМА

Моя проблема иллюстрируется следующим примером: если я удаляю индекс i, следующая матрица сжимается. Если я затем удалю индекс j>=i на следующей итерации, мне нужно будет добавить 1 к j, потому что его позиция уменьшилась по сравнению с исходной. Матрица NxN. Если я затем удалю индекс k=>j, мне нужно будет учесть два предыдущих изменения и так далее.


person econstud12345    schedule 15.01.2020    source источник


Ответы (2)


Обновление: мой друг дал мне подсказку. Он двухстрочный.

tracker_original_indices = np.arange(0, np.size(traj_dist_matrix, 0))
tracker_original_indices = np.delete(tracker_original_indices, lost_index, axis=0)
person econstud12345    schedule 16.01.2020

Возможно, это не лучший способ, но я бы следил за словарем, где ключи — это исходные позиции индекса, а значения — текущие позиции индекса. Я называю это index_mapping

Я создал функцию для применения удалений к index_mapping и показываю, что вы можете создать список удалений и применить их все в конце, но вы также можете применять их по одному.

Каждое событие удаления находится либо в позиции x, либо в позиции y, а также в индексе для текущего массива.

def process_deletions(index_mapping, deletions):
    for deletion in deletions:
        del_kind = deletion['kind']
        del_ind = deletion['index']

        for orig_ind,curr_ind in index_mapping[del_kind].items():
            #Don't update an index if it's less than the one deleted
            if curr_ind < del_ind:
                continue

            #Set the deleted index to now be -1
            elif curr_ind == del_ind:
                index_mapping[del_kind][orig_ind] = -1

            #Otherwise if the index is greater than the one deleted
            #decrement the new index it points to
            #i.e. if index 3 is deleted, what was index 5 is now index 4
            else:
                index_mapping[del_kind][orig_ind] -= 1

    return index_mapping


num_rows = 10
num_cols = 10

#Start out that each original index points to it's same position in the unmodified matrix
index_mapping = {
    'x':{i:i for i in range(num_rows)},
    'y':{i:i for i in range(num_cols)},
}

#Keep track of all the deletions made
#Can alternatively make one deletion at a time and keep applying it to the index_mapping
deletions = [
    {'kind':'x', 'index':1},
    {'kind':'y', 'index':1},
    {'kind':'x', 'index':6},
    {'kind':'y', 'index':6},
    {'kind':'x', 'index':4},
    {'kind':'y', 'index':4},
]
index_mapping = process_deletions(index_mapping, deletions)

print(index_mapping)
person mitoRibo    schedule 15.01.2020
comment
Благодарю вас! Ваше решение работает. Тем не менее, я нашел более простой способ, см. выше! - person econstud12345; 16.01.2020