我有一个 list
a = np.ones(100)
我想将该列表中的 50 个随机元素变为 0。一旦这些元素为 0,我想将列表中剩余元素的 25 个随机元素变为 0。在剩余的 25 个元素中,我想要变为 13剩余元素随机归零等。
然后我将通过一个简单的循环运行它,例如(伪代码)“如果项目 == 1,则打印红色粒子,否则打印蓝色粒子”等。
这基本上是为了模拟指数衰减,但我正在努力想出一种算法来做到这一点。
这不是“Numpy:替换数组中的随机元素”的副本,因为一旦元素发生更改,我不希望再次考虑更改它们。
请您参考如下方法:
您基本上需要数组中的递减值,并且似乎有额外的限制,即被 zeros 替换的值仅来自现有的 ones 集。要解决它,这里有一种方法 np.random.choice将其可选参数 replace 设置为 False 以获取每次迭代的唯一索引以分配 zeros 并使用 np.flatnonzero获取每次迭代的 ones 的剩余索引。
因此,实现看起来像这样 -
# Counts of ones to be set as zeros per iteration
counts = np.array([50,25,13,6,3,2,1])
a = np.ones(100,dtype=int)
for c in counts:
a[np.random.choice(np.flatnonzero(a), c, replace=False)] = 0
sample 运行-
In [49]: counts = np.array([50,25,13,6,3,2,1])
...: a = np.ones(100,dtype=int)
...: for c in counts:
...: a[np.random.choice(np.flatnonzero(a), c, replace=False)] = 0
...: print a.sum() # verify with summation of ones print at each iteration
50
25
12
6
3
1
0
要为通用长度输入数组 a 设置 counts 数组,我们可以这样做 -
N = int(np.log(len(a))/np.log(2)) # number of iterations
counts = (len(a)*((0.5)**(np.arange(N)+1))).astype(int)
