Рассмотрим многоуровневую матрицу формы (n,)
, которая монотонно возрастает.Python/Numpy найти длину переменной длины
X = np.array([2,3,7,19,110,112,120,140,161])
Моя проблема заключается в извлечении эффективно каждый Span (i,j)
таким образом, что:
X[i:j].sum() >= v and X[i:j-1].sum() < v
Я не уверен в этом формализации. Другими словами, мне нужны «наименьшие возможные промежутки, которые суммируются выше v». Я предполагаю, что другой способ выразить это «все промежутки, которые суммируются выше v и которые не являются подмножествами другого диапазона».
До сих пор лучшее, что я сделал на основе двух вложенной для петель:
def variable_length_spans(X, v):
n, = X.shape
for i in xrange(0, n):
sum_ = 0
for j in xrange(i, n):
sum_ += X[j]
if sum_ >= v:
yield (i,j+1)
break
Что дает:
list(variable_length_spans(X,10))
[(0, 3), (1, 3), (2, 4), (3, 4), (4, 5), (5, 6), (6, 7), (7, 8), (8, 9)]
Это должно быть более эффективным/элегантный способ сделать это. Но я могу узнать, как это сделать. Любое предложение будет тепло оценено!
Ф.
Обновление # 1: тайминги
С помощью 20K случайных элементов (результаты в среднем более 10 трасс):
- variable_length_spans: 0,009332 сек
- davis_spans: 0.009259 sec
- spans_broadcast: 1.896222 sec
1М случайных элементов (результаты в среднем более 50 трасс):
- variable_length_spans: 0,528101 сек
- davis_broadcast: 0,534576 сек
опечатка, извините, я имел в виду X вместо ДТ. Возврат невозможен, поскольку переменная_length_spans является генератором (помните оператор yield). –
Цените изменения! – Divakar
Итак, действительно ли код цикла, указанный в вопросе, действительно работает для достижения псевдокода: 'X [j] - X [i]> = v и X [j-1] - X [i]
Divakar