Как изменить p-значение Numpy .random.choice в зависимости от позиции в массиве? - PullRequest
0 голосов
/ 18 июня 2020

У меня есть 3D-массив размером NxNxN. Я хотел бы заполнить этот массив случайными логическими значениями, что можно сделать с помощью:

a = np.random.choice([False,True],size=(N,N,N))

Однако я бы хотел, чтобы вероятность (или p-значение) выбора True или False основывалась на позиция элемента в массиве. Я подумал, может быть, я смогу сделать это с параметром p-value, но это только тогда работает для выбора того, как часто True / False выбирается для всего массива.

Есть ли способ установить специфику c p -значения для всего массива (N, N, N)? Я предполагаю, что это будет составлять массив (N, N, N, 2), с дополнительными 2 для p-значения для False и p-value для True (хотя p_True = 1 - p_False). Я чувствую, что есть более простой способ сделать это, о котором я не думаю.

Изменить: Скажем, я хочу создать простой массив a формы (1,2) (всего два элемента, но нарочно многомерным). Я хочу заполнить эти два элемента True / False. У меня есть другой массив, заполненный вероятностью или p-значением, с которым я хочу, чтобы эти элементы были ложными, скажем, p_False, где p_False.shape = (1,2). Скажем, я хочу, чтобы первый элемент имел 25% шанс быть ложным, а второй элемент имел 50% шанс быть ложным, поэтому тогда p_False = np.array ([0.25,0.5]).

Я пробовал что-то вроде:

a = np.random.choice([[False,True],[False,True]],p=[[.25,.75],[.5,.5]])

, но получил ошибку ValueError: a должно быть одномерным.

Ответы [ 2 ]

1 голос
/ 18 июня 2020

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

# define an initial value of N
N = 512

# generate an array of probabilities. You can eventually build your own, since the size is respected
prob_array = np.array((range(0,N*N*N)))

# rescale the probabilities between 0 and 1
prob_array = (prob_array - np.min(prob_array)) / (np.max(prob_array) - np.min(prob_array))

# generate the random based on the probabilities, cast to booleans and reshape
np.reshape(np.array(np.random.binomial(1, p=prob_array, size=N*N*N), dtype=bool), (N,N,N))

Это генерирует массив с большим количеством Falses в начале и множеством True в конце:

array([[[False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        ...,
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False],
        [False, False, False, ..., False, False, False]],

       ...,


       [[ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        ...,
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True],
        [ True,  True,  True, ...,  True,  True,  True]]])
0 голосов
/ 18 июня 2020

Используйте метод binomial с массивом чисел в [0, 1]. Вот пример, который устанавливает для каждого элемента значение 0 или 1 в зависимости от случайно выбранной вероятности:

import numpy
gen=numpy.random.Generator(numpy.random.PCG64())
ret=gen.binomial(1, gen.uniform(size=(3, 3, 3)))

Если вы хотите, чтобы каждый элемент был True или False, а не 0 или 1, я боюсь, что я не знаю, как это сделать.

Обратите внимание, что numpy.random.Generator было введено в NumPy 1.7 . Рекомендуется использовать последнюю версию NumPy; тем временем вы можете использовать следующее:

import numpy
ret=numpy.random.binomial(1, numpy.random.uniform(size=(3, 3, 3)))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...