【问题标题】:Replace values in a 2D array with different random numbers用不同的随机数替换二维数组中的值
【发布时间】:2016-06-21 14:46:29
【问题描述】:

我有一个二维数组(图像),我想用某个范围内的随机数替换大于某个阈值的数组值。我的尝试是使用 numpy.random.uniform,所以

Z[Z > some_value] = uniform(lower_limit,upper_limit)

但是我发现这会将所有高于阈值的值替换为相同的随机值。我想用不同的随机值替换所有高于阈值的数组值。

我认为这需要对整个数组进行一些交互,如果满足条件,我需要为其生成一个随机值。我该怎么做?

【问题讨论】:

    标签: python arrays numpy random


    【解决方案1】:

    您是正确的,迭代将是正确的方法。让我们做一个list comprehension

    [uniform(lower_limit, upper_limit) if i > some_value else i
     for i in Z]
    

    让我们一步一步来。取一个单独的值。如果大于阈值,则使用随机生成的,否则使用原始值。

    uniform(lower_limit, upper_limit) if i > some_value else i
    

    对 Z 中的每个元素重复此操作

    for i in Z
    

    对于二维数组,嵌套多个推导。想象一下,上面的解决方案是在一行中点击所有内容,然后对每一行重复。

    [[uniform(lower_limit, upper_limit) if i > some_value else i
      for i in row]
      for row in Z]
    

    【讨论】:

    • 在实现这个之后我得到了错误ValueError: The truth value of an array with more than one element is ambiguous.我猜这是因为它是一个二维数组?有没有办法使用上面的列表理解进行迭代并保留数组(2d)的形状而不必将其转换为 1d 数组?
    • @maelstromscientist 我的道歉,更新了新的例子。对 2D 数组中的每个 1D 数组进行迭代(当然使用列表推导)应该适合您。
    • 没关系,我在变量名上犯了一个愚蠢的错误,一旦修复它就很好用。谢谢!
    • 嗯。不知道。可能是时候将有问题的代码分开了。 def small_or_random(num): ... 然后将理解简化为[[small_or_random(i) for i in row] for row in Z]。这应该更容易调试/推理。
    • @maelstromscientist 您应该开始习惯 numpy 提供的机制来一次处理整个数组,而不是通过循环或使用列表理解来逐个元素地进行操作。它在速度和可读性方面都是有利的。看我的回答。
    【解决方案2】:

    检查uniform 的第三个参数。使用size=N 将产生一个长度为N 的随机值数组。因此

    z[z>some_value] = np.random.uniform(lower, upper, len(z>some_value))
    

    会做你想做的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-04
      • 2021-11-28
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      相关资源
      最近更新 更多