【问题标题】:Assigning different random number to each slot in an array为数组中的每个槽分配不同的随机数
【发布时间】:2020-10-12 16:44:29
【问题描述】:

这是我的代码:

mut1 = np.zeros((100, 52))
mutate = lambda mut1 : mut1 + (np.random.uniform(0, 1) > 0.5) * np.random.uniform(-0.1, 0.1)
mut1 = mutate(mut1)
print(mut1)

[[-0.02017634 -0.02017634 -0.02017634 ... -0.02017634 -0.02017634
  -0.02017634]
 [-0.02017634 -0.02017634 -0.02017634 ... -0.02017634 -0.02017634
  -0.02017634]
 [-0.02017634 -0.02017634 -0.02017634 ... -0.02017634 -0.02017634
  -0.02017634]
 ...
 [-0.02017634 -0.02017634 -0.02017634 ... -0.02017634 -0.02017634
  -0.02017634]
 [-0.02017634 -0.02017634 -0.02017634 ... -0.02017634 -0.02017634
  -0.02017634]
 [-0.02017634 -0.02017634 -0.02017634 ... -0.02017634 -0.02017634
  -0.02017634]]

问题是我的mut1 数组中的每个元素都获得了相同的突变。

【问题讨论】:

  • 这里有 lambda 的原因吗?有什么理由你不能这样做:mut1 + =(np.random.uniform(0,1,mut1.shape) > 0.5) * np.random.uniform(-0.1,0.1,mut1.shape)?
  • 哎呀,试图让它过于复杂。谢谢vm
  • 发生这种情况是因为(np.random.uniform(0,1) > 0.5) * np.random.uniform(-0.1,0.1) 将被广播以添加到 mut1 数组中。由于它只是广播的单个值,因此您将在 mut1 数组中看到相同的突变。

标签: python numpy random


【解决方案1】:

您正在将随机突变添加到整个数组中,这就是所有元素都相同的原因。您需要为每个元素执行此操作:

mut1 = np.zeros((100,52))
mutate = lambda x : x + (np.random.uniform(0,1) > 0.5) * np.random.uniform(-0.1,0.1)
mutator = np.vectorize(mutate)
mutator(mut1)
print(mut1)

【讨论】:

  • 另一个替代np.vectorize(没有魔法)的选项是根据x指定随机数组的形状,如a comment on OP's post中所写。
  • 您的诊断很准确,但vectorize 几乎从来都不是 numpy 中的最佳选择,因为它只是一个美化的 python 循环。
【解决方案2】:

您需要生成至少与您想填充插槽一样多的数字。简单的方法是使用np.where,并从原始数组或基于掩码的突变中进行选择:

mut1 = np.where(np.random.randint(2, size=mut1.shape, dtype=bool),
                np.random.uniform(-1.0, 1.0, size=mut1.shape), mut1)

这有点浪费,因为它为整个数组生成随机数,而不仅仅是被屏蔽的部分。您可以通过直接设置遮罩部分来缓解这种情况。

mask = np.random.randint(2, size=mut1.shape, dtype=bool)
count = np.count_nonzero(mask)
mut1[mask] = np.random.uniform(-1.0, 1.0, size=count)

注意事项:

  • 如果您不为每个更新的元素生成单独的值,则单个值将被广播给所有元素。
  • lambda 在功能上与函数相同。您根本不需要在这里使用它。
  • 在这种特殊情况下,不需要对浮点数组设置阈值来获取掩码,因为您可以直接生成布尔值。不过,对于不合理的比率,阈值化会更容易。

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 1970-01-01
    • 2019-12-06
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    相关资源
    最近更新 更多