Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 以给定的概率改变数组的元素数_Arrays_Random_Numpy - Fatal编程技术网

Arrays 以给定的概率改变数组的元素数

Arrays 以给定的概率改变数组的元素数,arrays,random,numpy,Arrays,Random,Numpy,我有一个随机数数组。我只想在概率为0.07的基础上改变一些元素。目前,我正在使用for循环来迭代每个元素。有更好的方法吗?如果所讨论的数组被称为a,您可以通过 a[numpy.random.rand(*a.shape) < 0.07] a[numpy.random.rand(*a.shape)

我有一个随机数数组。我只想在概率为0.07的基础上改变一些元素。目前,我正在使用for循环来迭代每个元素。有更好的方法吗?

如果所讨论的数组被称为
a
,您可以通过

a[numpy.random.rand(*a.shape) < 0.07]
a[numpy.random.rand(*a.shape)<0.07]
我不知道您想如何更改这些值。要把它们乘以2,只需这样做

a[numpy.random.rand(*a.shape) < 0.07] *= 2.0
a[numpy.random.rand(*a.shape)<0.07]*=2.0

斯文的回答很优雅。但是,选择要更改的图元要快得多

n = numpy.random.binomial(len(a), 0.07)
a[numpy.random.randint(0, len(a), size=n)] *= 2.0
第一个表达式确定要采样的元素数(n是0到len(a)之间的整数,但平均值为0.07),第二个表达式正好生成要检索的索引数。(但是,请注意,您可能会多次获得相同的索引。)

区别在于

a[numpy.random.rand(len(a)) < p]
a[numpy.random.rand(len(a))

当p接近1时变小,但对于小p,它可能是10倍或更多。

太棒了!非常感谢。我只是想把它们改成其他随机值。这比我的for循环要好得多。请注意,(独立地)改变概率为p的元素和改变“其值的比例p”之间存在差异。我认为显示的代码就是前者。@tc如何实现后者?@wot:使用
random.sample(xrange(len(a)),int(len(a)*0.07))
作为索引,或者说模取整。@tc:您提出了一个很好的观点,但您提供的解决方案将扼杀此答案中的方法对OP原始循环的所有性能改进。