Масштабирование массива в соответствии с заданной суммой

#python #arrays #numpy #math

#python #массивы #numpy #математика

Вопрос:

Я хочу взять существующий массив и соответствующим образом его масштабировать, чтобы конечная сумма массива представляла собой определенное (вводимое пользователем) число. Например:

 import numpy as np

array = np.random.randint(5, size=(2, 2))
sum   = np.sum(array)
print(array)
maxsum = 5

array = np.round((array*maxsum)/sum)

print(np.sum(array))
print(array)
 

Использование приведенного выше кода для массива, такого как: [[1 4] [4 3]] возвращает [[0. 2.] [2. 1.]] , что нормально, поскольку оно суммируется с суммой, которую я хочу, в соответствии с «важностью» каждого элемента.

Проблема начинается, когда я хочу масштабировать массивы большего размера, такие как 60×60 или больше, потому что каждый элемент нормализуется в диапазоне [0,1], поэтому каждый элемент очень близок к 0 после его деления на большое число (сумму), поэтому каждый конечный элемент возвращается как 0.

Мне нужно выводить целые числа и всегда положительные.

Я пытался использовать ceil или floor вместо round и нормализовать в соответствии с максимальным значением исходного массива, но я все еще не могу найти решение. Любой совет был бы полезен, заранее спасибо!

Комментарии:

1. почему вы используете np.round ? вам нужно, чтобы ваши выходные элементы тоже были целыми числами? если это так, вы не можете линейно масштабировать целые числа в целые числа. т. сумма представляет собой определенное значение. Для этого вы можете выполнить аппроксимацию и переключить ceil / floor.

2. @Ehsan Да, мне нужно выводить целые числа, извините, я не упомянул об этом.

3. Разве вы не можете обернуть содержимое вокруг экспоненциальной функции? И просто логарифм — из этого? пример: np.exp(0.4) / sum будет намного разумнее, чем чисто 0.4/sum , а затем, когда вам нужно фактическое значение, вы можете просто использовать natural log для «выхода» из эффекта функции exp

4. @progenRobot это возвращает некоторые отрицательные значения, я хочу, чтобы в решениях были только положительные целые числа