提问人:lara_toff 提问时间:6/23/2020 最后编辑:Mad Physicistlara_toff 更新时间:6/23/2020 访问量:175
为阵列中的每个插槽分配不同的随机数
Assigning different random number to each slot in an array
问:
这是我的代码:
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
答:
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赞
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 在功能上与函数相同。你根本不需要在这里使用它。
- 在这种特殊情况下,无需对浮点数组进行阈值设置阈值即可获取掩码,因为您可以直接生成布尔值。不过,对于非理性比率,阈值会更容易。
评论
mut1 + =(np.random.uniform(0,1,mut1.shape) > 0.5) * np.random.uniform(-0.1,0.1,mut1.shape)
(np.random.uniform(0,1) > 0.5) * np.random.uniform(-0.1,0.1)