обновление значений в 2D матрице после использования индексов и логического выбора - PullRequest
0 голосов
/ 15 мая 2018

У меня есть матрица для хранения k минимальных расстояний для N элементов.Всякий раз, когда появляется новый элемент, я хочу вычислить расстояния до всех N элементов, и, если какое-либо расстояние меньше максимального сохраненного расстояния, я хочу обновить это значение и сохранить новое расстояние.Первоначально расстояния установлены на np.inf.

elems = np.array([[5, 5],[4, 4],[8, 8]])
k=2
center_mindists = np.full((len(elems),k), np.inf)

Поэтому, когда приходит новый элемент, скажем, x=np.array([1,1]) Я должен вычислить расстояние до всех элементов и сохранить его, если оно меньше максимальногорасстояние, сохраненное в то время

distances = np.sum(np.abs(elems - x)) #[8 6 14]

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

max_min_idx = np.argmax(center_mindists, axis=1) #[0 0 0]
id0 = np.indices(max_min_idx.shape)
lower_id = distances < centers_mindists[id0, max_min_idx]

Наконец, я должен обновить эти значения новыми:

center_mindists[id0, max_min_idx][lower_idx] = distances[lower_idx[0]]

Дело в том, что назначение не меняет значения в матрице center_min_dists, и я не смог найтирешение для этого.

Большое спасибо !!

Ответы [ 2 ]

0 голосов
/ 15 мая 2018

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

center_mindists[id0, max_min_idx][lower_idx] = distances[lower_idx[0]]

явно обновите копию и присвойте ее обратно:

temp = center_mindists[id0, max_min_idx]
temp[lower_idx] = distances[lower_idx[0]]
center_mindists[id0, max_min_idx] = temp

Это на самом деле довольно удобно, потому что вы действительно используете temp для вычисления маски lower_idx.

0 голосов
/ 15 мая 2018

center_mindists[id0, max_min_idx] является копией, потому что индексы не являются срезами (базовая индексация).

center_mindists[id0, max_min_idx][lower_idx] = ...

изменяет эту копию, а не оригинал, поэтому ничего не происходит.

Вам нужно как-то объединить индексы, чтобы у вас был только один набор расширенных индексов

center_mindists[idx0, idx1] = ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...