random.choice для 2D массива, большие числа с большей вероятностью? - PullRequest
2 голосов
/ 12 января 2020

Существует ли способ случайного выбора n элементов из каждой строки в двумерном массиве с более высокой вероятностью выбора больших значений без использования L OOP

random.choice () работает только для 1D массива ...

Fe, если у меня есть:

 q = np.random.random((10,10))

я могу выбрать макс-2 в каждой строке следующим образом:

  np.sort(q,axis=1)[:,-2:]

что я вместо этого нужно выбрать 2 случайно, не всегда максимум, но с большей вероятностью большие числа ..

вот как вы получите одну строку с вероятностями:

np.random.choice(q[0,:], p=q[0,:]/q[0,:].sum())

Ответы [ 2 ]

1 голос
/ 12 января 2020

Вы можете использовать apply_along_axis :

q = np.random.random((10,10))

def choice(row, n, replace=False):
    return np.random.choice(row, size=n, p=row/row.sum(), replace=replace)

np.apply_along_axis(func1d=choice, axis=1, arr=q, n=2)

Я не знаю, какой у вас массив, но вам, вероятно, следует проверить, что row.sum() не равно 0, чтобы избежать ошибок в вычисление p=row/row.sum().

0 голосов
/ 12 января 2020

Решение, отличное от numpy, которое использует random.choices , следующее:

res = [random.choices(l, weights=l, k=2) for l in q]
...