Вы можете использовать itertools.product
и filter
, чтобы создать все комбинации на сумму 10 и передать их в массив:
import itertools
f = filter(lambda x: sum(x) == 10, itertools.product(*[range(11)]*5))
x = np.array(list(f)).astype(np.float)/10
x
>> array([[0. , 0. , 0. , 0. , 1. ],
[0. , 0. , 0. , 0.1, 0.9],
[0. , 0. , 0. , 0.2, 0.8],
...,
[0.9, 0. , 0.1, 0. , 0. ],
[0.9, 0.1, 0. , 0. , 0. ],
[1. , 0. , 0. , 0. , 0. ]])
РЕДАКТИРОВАТЬ
Длязапись, вот более эффективный способ без использования фильтрации. По сути, вы создаете k
бинов (в вашем примере 10) и «присваиваете» их «n» семплам (в вашем примере 3) во всех возможных комбинациях, используя combinations_with_replacement
Затем выпосчитайте, сколько бинов получает каждый образец: это ваша вероятность. Этот метод более сложен для понимания, но избегает filter
, и, следовательно, он намного эффективнее. Вы можете попробовать это с делениями 0,01 (k = 100
)
n = 3 # number of samples
k = 100 # number of subdivisions
f = itertools.combinations_with_replacement(range(3),k) #your iterator
r = np.array(list(f)) #your array of combinations
x = np.vstack((r==i).sum(1) for i in range(n)).T/k #your probability matrix