Превращение маскированных результатов в разные случайные числа - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу сделать что-то вроде этого.

import numpy

# Create a 10x10 array of random numbers.
example_array = numpy.random.random_integers(0, 10, size=(10, 10))

# Locate values that equal 5 and turn them into a new random number.
example_array[example_array == 5] = numpy.random.random_integers(0, 10)

Проблема с последней строкой.Он применяет одно случайное число ко всем замаскированным значениям вместо нового случайного числа для каждого значения.Например, если выбрано число 2, все значения, которые == 5 становятся равными 2. Я хочу, чтобы для каждого из них было совершенно новое значение, а не для всех, чтобы они имели одинаковое случайное значение.Надеюсь это имеет смысл!Пожалуйста, посоветуйте.

Извинения за любую путаницу.У меня пока нет обалденной терминологии.

Вот еще один пример, который может помочь.

# Before replacing 5's with a random number.
array=[4, 5, 5,
       5, 2, 3,
       5, 4, 5]

# After replacing 5's with a random number.
array=[4, 1, 4,
       7, 2, 3,
       2, 4, 8]

Кажется, что-то, что должно быть легко сделать, но я не могу понять, каксделать это эффективно.Я хочу сделать это, используя маску для скорости.Мой в настоящее время работающий (и очень медленный!) Метод - это циклически проходить по массиву и бросать кубик для любых значений, которые требуют рандомизации.

1 Ответ

0 голосов
/ 25 ноября 2018

Используйте np.random.choice с количеством маскируемых элементов -

import numpy as np

mask = example_array == 5
select_nums = np.r_[:5,6:10] # array from which elements are to be picked up
                             # we need to skip number 5, so we are using np.r_
                             # to concatenate range arrays
example_array[mask] = np.random.choice(select_nums, mask.sum())
...