Поиск индексов, в которых истинные значения соединяются по вертикали и горизонтали с numpy - PullRequest
0 голосов
/ 05 мая 2020

Я хочу объединить определенные значения, которые численно близки.

В этом примере я постараюсь объединить все, что может быть подключено через соседнее значение с разницей меньше 2

import numpy as np
a = np.arange(10)
a = np.delete(a, (3, 7))
matrix = np.abs(a.reshape(-1,1) - a)
matrix < 2
array([[ True,  True, False, False, False, False, False, False],
       [ True,  True,  True, False, False, False, False, False],
       [False,  True,  True, False, False, False, False, False],
       [False, False, False,  True,  True, False, False, False],
       [False, False, False,  True,  True,  True, False, False],
       [False, False, False, False,  True,  True, False, False],
       [False, False, False, False, False, False,  True,  True],
       [False, False, False, False, False, False,  True,  True]])

Начиная с верхнего левого угла:

  • Сначала переместите горизонтально, чтобы найти последнее истинное значение.
  • Затем go вниз, чтобы найти последнее истинное значение.
  • Повторяйте оба, пока квадрат не будет найден.
  • Невозможно соединить истинные значения по диагонали.

Это даст вам первый квадрат, который идет от [0,2] до [2 , 2].

Желаемый результат этого примера будет:

[[0, 2], [3, 5], [6, 7]]

Где значения указывают начало и конец квадрата. Есть ли хороший способ сделать это?

Я бы предпочел не l oop, если возможно.

1 Ответ

0 голосов
/ 05 мая 2020

Итак, я сделал это, используя np.diagonal в качестве основы для logi c.

bm = matrix < 2
endcoords = np.argwhere(bm[1:].diagonal() == False)
zers = np.zeros(endcoords.shape)
zers[1:] += endcoords[:-1] + 1
end = np.hstack((zers, endcoords))
end
array([[0., 2.],
       [3., 5.]])

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

...