У меня есть матрица Nx2, такая как:
M = [[10, 1000],
[11, 200],
[15, 800],
[20, 5000],
[28, 100],
[32, 3000],
[35, 3500],
[38, 100],
[50, 5000],
[51, 100],
[55, 2000],
[58, 3000],
[66, 4000],
[90, 5000]]
Мне нужно создать матрицу Nx3, которая отражает отношение строк из первой матрицы следующим образом:
Используйте правый столбец для определения кандидатов на границы диапазона. Условие имеет значение> = 1000
Это условие применимо к матрице:
[[10, 1000],
[20, 5000],
[32, 3000],
[35, 3500],
[50, 5000],
[55, 2000],
[58, 3000],
[66, 4000],
[90, 5000],]
До сих пор я придумал "M [M[:, 1]> = 1000] "который работает.Для этой новой матрицы я хочу теперь проверить точки в первом столбце, к которым относится расстояние до следующей точки <= 10, и использовать их в качестве границ диапазона. </p>
То, что я до сих пор придумал: np.diff(M [:, 0]) <= 10, что возвращает: </p>
[True, False, True, False, True, True, True, False]
Вот где я застрял.Я хочу использовать это условие для определения нижней и верхней границы диапазона.Например:
[[10, 1000], #<- Range 1 start
[20, 5000], #<- Range 1 end (as 32 would be 12 points away)
[32, 3000], #<- Range 2 start
[35, 3500], #<- Range 2 end
[50, 5000], #<- Range 3 start
[55, 2000], #<- Range 3 cont (as 55 is only 5 points away)
[58, 3000], #<- Range 3 cont
[66, 4000], #<- Range 3 end
[90, 5000]] #<- Range 4 start and end (as there is no point +-10)
Наконец, возвращаясь к самой первой матрице, я хочу добавить значения в правом столбце вместе для каждого диапазона в пределах (включая) границы.
ИтакУ меня есть четыре диапазона, которые определяют начало и конец границ.
- Диапазон 1: начало 10, конец 20
- Диапазон 2: начало 32, конец 35
- Диапазон 3: начало 50, конец 66
- Диапазон 4: начало 90, конец 90
Получившаяся матрица будет выглядеть следующим образом, где столбец 0 - начальная граница, столбец 1 -конец границы и столбец 2 добавленные значения из матрицы M из правого столбца между началом и концом.
[[10, 20, 7000], # 7000 = 1000+200+800+5000
[32, 35, 6500], # 6500 = 3000+3500
[50, 66, 14100], # 14100 = 5000+100+2000+3000+4000
[90, 90, 5000]] # 5000 = just 5000 as upper=lower boundary
Я застрял на втором шаге, после того как я получил значения true / false для границ диапазона.Но как мне создать диапазоны из логических значений, а затем как сложить значения в этих диапазонах, мне неясно.Буду признателен за любые предложения.Кроме того, я не уверен в своем подходе, может быть, есть лучший способ перейти от первой к последней матрице, может быть, пропуская один шаг ??
РЕДАКТИРОВАТЬ
Итак, я пришелнемного дальше со средним шагом, и теперь я могу вернуть начальное и конечное значения диапазона:
start_diffs = np.diff(M[:,0]) > 10
start_indexes = np.insert(start_diffs, 0, True)
end_diffs = np.diff(M[:,0]) > 10
end_indexes = np.insert(end_diffs, -1, True)
start_values = M[:,0][start_indexes]
end_values = M[:,0][end_indexes]
print(np.array([start_values, end_values]).T)
Возвращает:
[[10 20]
[32 35]
[50 66]
[90 90]]
Чего не хватает, так или иначе используя эти диапазоныТеперь вычислим суммы из матрицы М в правом столбце.