Pythoni c способ объединения проксимальных сегментов в массиве 2D numpy? - PullRequest
1 голос
/ 31 января 2020

У меня есть массив 2D numpy, который представляет фрагментированные сегменты времени как время начала / окончания. Я разработал способ объединения сегментов, когда они проксимальны (меньше, чем минимальная длина зазора):

def join_proximal_segments(original_segments, min_gap):

  begins = np.array([original_segments.T[0, 0]])
  ends = np.array([])

  for i in np.arange(len(original_segments)-1):

    if((original_segments.T[0, i+1] - original_segments.T[1, i]) > min_gap):

      begins = np.append(begins, original_segments.T[1, i])
      ends = np.append(ends, original_segments.T[0, i+1])

  ends = np.append(ends, original_segments.T[1, -1])

  joined_segments = np.array([begins, ends]).T

  return joined_segments

Это выглядит довольно не элегантно. Есть ли более прямой способ решения этой проблемы с использованием numpy?

Редактировать: пример массива

detections = np.array([[2, 60],[62, 78],[97, 105],[255, 340],[343, 347]])

1 Ответ

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

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

import numpy as np

min_gap = 10
original_segments = np.array([[  2,  60],
                              [ 62,  78],
                              [ 97, 105],
                              [255, 340],
                              [343, 347]])


def join_proximal_segments(original_segments, min_gap):
    diff = original_segments[1:, 0] - original_segments[:-1, 1]
    diff_bool = diff > min_gap

    joined_segments = np.empty((sum(diff_bool)+1, 2),
                                 dtype=original_segments.dtype)
    # beginnings
    joined_segments[0, 0] = original_segments[0, 0]
    joined_segments[1:, 0] = original_segments[:-1, 1][diff_bool]
    # ends
    joined_segments[:-1, 1] = original_segments[1:, 0][diff_bool]
    joined_segments[-1, 1] = original_segments[-1, 1]

    return joined_segments


print(join_proximal_segments(original_segments, min_gap))
# [[  2  97]
#  [ 78 255]
#  [105 347]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...