Нахождение начальных / конечных положений и длины самой длинной и самой короткой последовательности 1 с или 0 с в матричной единице - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть матовая матрица, которая выглядит следующим образом:

matrix = [[0., 0., 0., 0., 0., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 1., 1., 1., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
         [0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.,
           1., 1., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.],
         [0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,
           0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.]]  

Как бы получить длину самой длинной последовательности 1 или 0? Кроме того, как бы я получил их начальную и конечную позиции?

Есть ли более простой способ сделать это?

Формат вывода является гибким, если он обозначает индекс внутреннего списка, значение длины и индексы списка значений.

Пример:
Самые длинные: 1, 16, 2, 17 (индекс внутреннего списка, длина, самое длинное начало индекса 1 с последовательности, самое длинное положение конца 1 с позиции). или [1, 16, 2, 17] / (1, 16, 2, 17)
Самые длинные нули: 2, 45, 0, 45

Не дубликат этих вопросов, поскольку это касается матрицы:
найти начальную позицию самой длинной последовательности 1-х

Результат (самый длинный) следует учитывать среди всех списков.
Счетчик последовательности не продолжается, когда он достигает конца внутреннего списка.

1 Ответ

0 голосов
/ 14 сентября 2018

Используя Divakar's base answer, вы можете адаптироваться, используя np.vectorize, устанавливая аргумент signature и делая простые математические операции, чтобы получить то, что вы ищете.

Взять, к примеру,

m = np.array(matrix)

def get_longest_ones_matrix(b):
    idx_pairs = np.where(np.diff(np.hstack(([False], b==1, [False]))))[0].reshape(-1,2)
    if not idx_pairs.size: return(np.array([0,0,0]))

    d = np.diff(idx_pairs, axis=1).argmax()

    start_longest_seq = idx_pairs[d,0]
    end_longest_seq   = idx_pairs[d,1]

    l = end_longest_seq - start_longest_seq
    p = start_longest_seq % 45
    e = end_longest_seq - 1
    return(np.array([l,p,e])) 

s = m.shape[-1]

v = np.vectorize(get_longest_ones_matrix, signature=f'(s)->(1)')
x = v(m)

, что дает

[[ 3 26 28]
 [16  2 17]
 [ 0  0  0]]

Тогда

a = x[:,0].argmax()
print(a,x[a])
1 [16  2 17]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...