#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 для «выхода» из эффекта функции exp4. @progenRobot это возвращает некоторые отрицательные значения, я хочу, чтобы в решениях были только положительные целые числа