【问题标题】:Turning masked results into different random numbers将屏蔽结果转换为不同的随机数
【发布时间】:2019-04-27 04:29:46
【问题描述】:

我想做这样的事情。

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]

这似乎应该很容易做到,但我不知道如何有效地做到这一点。为了提高速度,我想使用面具来做到这一点。我目前的工作(而且超级慢!)方法是循环数组并为任何需要随机化的值掷骰子。

【问题讨论】:

    标签: python arrays numpy vectorization mask


    【解决方案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())
    

    【讨论】:

    • 非常感谢。这有助于将我的游戏的地图生成速度提高 182%!我投了赞成票,但我是新人,所以不幸的是它暂时被隐藏了。
    猜你喜欢
    • 2021-10-09
    • 2023-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-04
    相关资源
    最近更新 更多