Отслеживание оптимальных показателей при уменьшении матрицы на 1x1 каждую итерацию - PullRequest
0 голосов
/ 16 января 2020

SETUP

У меня диагональная матрица 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?

FAILURE

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

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]

NARROW DOWN ISSUE

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

Ответы [ 2 ]

1 голос
/ 16 января 2020

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

tracker_original_indices = np.arange(0, np.size(traj_dist_matrix, 0))
tracker_original_indices = np.delete(tracker_original_indices, lost_index, axis=0)
0 голосов
/ 16 января 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)
...