как найти элементы массива Numpy, для которых задана сумма

Есть простая задача определить индексы элементов массива Numpy, сумма которых меньше определённого числа. Причем элементы должны суммироваться от наибольшего до наименьшего, пока не получится число близкое к заданной сумме. Как сделать это без циклов с помощью Numpy? Спасибо!

import numpy as np
massiv = np.random.sample(10)
print('исходный массив ', massiv)
summa_zadano = 2.0
print('заданная сумма: ', summa_zadano)
massiv_sort = np.sort(massiv)
massiv_obratn_sort = massiv_sort[::-1]
indeksi_massiva_sort = np.argsort(massiv)[::-1]
massiv_obratn_sort = np.take_along_axis(massiv, indeksi_massiva_sort, axis=0)
for i in range(len(massiv)):
    summa = np.sum(massiv_obratn_sort[0:i+1])
    if summa >= summa_zadano:
        print(massiv_obratn_sort[0:i])
        print(np.sum(massiv_obratn_sort[0:i]))
        print(indeksi_massiva_sort[0:i])
        break

Ответы (2 шт):

Автор решения: MBo

Для сортированного массива посчитать кумулятивные суммы (cumsum) и бинарным поиском найти нужную.

→ Ссылка
Автор решения: bluesky
import numpy as np
massiv = np.random.sample(10)
print('исходный массив: ', massiv)
summa = 2.0
indeksi_1 = np.argsort(massiv)[::-1]
massiv_2 = np.take_along_axis(massiv, indeksi_1, axis=0)
s = np.cumsum(massiv_2)
indeksi_2 = np.where(s < summa)[0]
indeksi_1[indeksi_2]
→ Ссылка