Numpy: Как рассчитать суммы срезов массива, используя Indeces? - PullRequest
0 голосов
/ 14 октября 2018

У меня есть матрица M:

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]]

И матрица R:

 [[10 20]
  [32 35]
  [50 66]
  [90 90]]

Я хочу использовать значения в столбце 0 матрицы R в качестве начального значения срезаи значение в столбце 1 как конец среза.

Я хочу вычислить сумму между и включением диапазонов этих срезов из правого столбца в матрице М.

В основном выполняем

  M[0:4][:,1].sum() # Upper index +1 as I need upper bound including
  M[5:7][:,1].sum() # Upper index +1 as I need upper bound including

и так далее.0 - это индекс 10, а 3 - это индекс 20. 5 - это индекс 32, 6 - индекс 35.

Я застрял в том, как получить начальные / конечные значения из матрицы Rв единицах по столбцу 0 матрицы 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

Обновление, теперь я могу получить индексыс помощью поиска отсортированы.Теперь мне просто нужно использовать сумму в столбце 1 матрицы M в начале и в конце.

 start_indices = [0,5,8,13]
 end_indices = [3,6,12,13]

Интересно, есть ли более эффективный способ, чем применение цикла for?

EDIT:Нашел ответ здесь. Числовая сумма значений в подмассивах между парами индексов

Ответы [ 2 ]

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

Используйте searchsorted для определения правильных индексов и add.reduceat для выполнения суммирования:

>>> idx = M[:, 0].searchsorted(R) + (0, 1)
>>> idx = idx.ravel()[:-1] if idx[-1, 1] == M.shape[0] else idx.ravel()
>>> result = np.add.reduceat(M[:, 1], idx)[::2]
>>> result
array([ 7000,  6500, 14100,  5000])

Подробности:

Поскольку вы хотите включить верхние границы, но Python исключает ихмы должны добавить 1.

reduceat не может обработать len (arg0) в качестве индекса, мы имеем в особом случае, что

reduceat вычисляет все отрезки между последовательными границами, мы должныоткажитесь от любого другого

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

Я думаю, что было бы лучше показать пример результата, который вы ожидаете.Если то, что вы хотите рассчитать с помощью M[0:4][:,1].sum(), является суммой 1000 + 200 + 800 + 5000. Тогда этот код может помочь:

import numpy as np

M = np.matrix([[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]])


print(M[0:4][:,1].sum())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...