Подвыборка 1D массива целых чисел, чтобы сумма достигла целевого значения в python - PullRequest
1 голос
/ 21 апреля 2020

У меня есть два одномерных массива целых чисел, некоторые из которых отличаются, например:

a = [1,2,2,0,3,5]
b = [0,0,3,2,0,0]

Я бы хотел, чтобы сумма каждого массива была равна сумме наименьшего из двух. Однако я хочу сохранить значения в виде целых чисел, а не с плавающей точкой, поэтому деление не вариант. Решением является некоторая подвыборка самого большого массива, так что его сумма равна сумме наименьшего:

target = [min(sum(a), sum(b))]

Однако я не могу найти функцию, которая выполняла бы такую ​​подвыборку. Единственное, что я нашел, это scipy, но они, кажется, предназначены для обработки звукового сигнала. Альтернативой была функция пакета scikit-bio , но она не работает на Python 3.7.

1 Ответ

0 голосов
/ 21 апреля 2020

Вы можете преобразовать массив в индексы, сэмплировать индексы и преобразовать обратно в значения следующим образом:

import numpy as np
np.random.seed(0)
a = np.array([1,2,2,0,3,5])

# Generate an array of indices, values in "a"
# define the number of occurences of their index
a_idx = np.array([i for i in range(len(a))])
a_idx = np.repeat(np.arange(len(a)), a)
# [0, 1, 1, 2, 2, 4, 4, 4, 5, 5, 5, 5, 5]

# Randomly shuffle indices and pick the n-first
a_sub_idx = np.random.permutation(a_idx)[:target]
# [4, 1, 2, 2, 5]

# Count the number of occurences of each index
a_sub_idx, a_sub_vals = np.unique(a_sub_idx, return_counts=True)
# Generate a new array of values the sampled indices
a_sub = np.zeros(a.shape)
a_sub[a_sub_idx] = a_sub_vals
# [0., 1., 2., 0., 1., 1.]
...