将屏蔽结果转换为不同的随机数

时间:2018-11-25 08:01:53

标签: python arrays numpy vectorization mask

我想做这样的事情。

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。我希望为每个值提供一个全新的值,而不是让它们都具有相同的随机值。我希望这是有道理的!请告知。

抱歉给您带来混乱。我还没有numpy的术语。

这是另一个可能有用的示例。

# 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 :(得分:1)

使用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())