случайная матрица с суммой значений по столбцу не больше единицы - PullRequest
0 голосов
/ 30 апреля 2018

Я застрял с матрицами в NumPy. Мне нужно создать матрицу, где сумма по столбцу будет не больше единицы.

np.random.rand(3,3).round(2)

дает

array([[ 0.48,  0.73,  0.81],
       [ 0.4 ,  0.01,  0.32],
       [ 0.44,  0.4 ,  0.92]])

Есть ли умный способ генерировать матрицу со случайными числами, где сумма по столбцу будет не больше единицы? Спасибо!

Ответы [ 3 ]

0 голосов
/ 30 апреля 2018

Нормализуйте столбцы случайным значением 0

>>> for i in range(3): a[:,i] = a[0,i] * a[:,i] / np.sum(a[:,i])
>>> a
array([[0.02041667, 0.42772512, 0.01939597],
       [0.07875   , 0.17109005, 0.0433557 ],
       [0.04083333, 0.35118483, 0.10724832]])
>>> np.sum(a,axis=0)
array([0.14, 0.95, 0.17])
0 голосов
/ 30 апреля 2018

Вы всегда можете убедиться, что ваши значения для начала ограничены:

>>> numcols=3
>>> np.random.uniform(0,1/numcols,9).reshape(3,3)
array([[ 0.26718273,  0.29798534,  0.0309619 ],
       [ 0.10923526,  0.12371555,  0.03797226],
       [ 0.15974434,  0.02435774,  0.30885667]])

Для квадратной матрицы это имеет то преимущество (может быть, нет?), Что она работает одновременно и на строках. Вы не можете иметь строки (0,0,1).

0 голосов
/ 30 апреля 2018

Вы можете сделать это:

x = np.random.rand(3,3)
x /= np.sum(x, axis=0)

Основанием для этого является то, что вы делите каждый столбец на сумму всех значений. Это гарантирует, что все столбцы будут добавлены к 1.

Или вы можете сделать:

x = np.random.rand(3,3)/3

Потому что каждое число будет между [0,1]. Если вы добавите домен к [0,1 / 3], то гарантируется, что сумма будет <1. </p>

Как правило, неясно, что вы имеете в виду, когда хотите ограничить числа, но при этом хотите, чтобы они были случайными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...