как найти элементы массива 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]