为阵列中的每个插槽分配不同的随机数

Assigning different random number to each slot in an array

提问人:lara_toff 提问时间:6/23/2020 最后编辑:Mad Physicistlara_toff 更新时间:6/23/2020 访问量:175

问:

这是我的代码:

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

python numpy 随机

评论

0赞 Jon Clements 6/23/2020
这里有 lambda 的理由吗?有什么理由你不能做这样的事情:?mut1 + =(np.random.uniform(0,1,mut1.shape) > 0.5) * np.random.uniform(-0.1,0.1,mut1.shape)
0赞 lara_toff 6/23/2020
哎呀,试图让它过于复杂。谢谢VM
0赞 Kavindu Vindika 6/23/2020
发生这种情况是因为将广播以添加到 mut1 数组中。由于它只是一个已广播的值,因此您将在 mut1 数组中看到相同的突变。(np.random.uniform(0,1) > 0.5) * np.random.uniform(-0.1,0.1)
0赞 Scott Boston 6/23/2020
stackoverflow.com/a/43788033/6361531

答:

0赞 Dallan 6/23/2020 #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)

评论

0赞 jkr 6/23/2020
另一种选择是(没有魔法)是根据 指定随机数组的形状,如 OP 帖子的评论中所写的那样。np.vectorizex
0赞 Mad Physicist 6/23/2020
你的诊断是正确的,但几乎从来都不是numpy的最佳选择,因为它只是一个美化的python循环。vectorize
0赞 Mad Physicist 6/23/2020 #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 在功能上与函数相同。你根本不需要在这里使用它。
  • 在这种特殊情况下,无需对浮点数组进行阈值设置阈值即可获取掩码,因为您可以直接生成布尔值。不过,对于非理性比率,阈值会更容易。