我有一个清单
a = np.ones(100)
我想将该列表中的50个随机项目变为0.一旦这些元素为0,我想将列表中剩余项目的25个随机元素变为0.在剩下的25个中,我想转13剩下的元素随机等零。
然后,我将通过一个简单的循环来运行它,例如(伪代码)“if item == 1,print red particle,else print blue particle”等。这基本上是模拟指数衰减,但我很难想到算法来做到这一点。
这不是“Numpy:替换数组中的随机元素”的副本,因为一旦元素发生了变化,我不希望它们再次被考虑进行更改。
答案 0 :(得分:3)
你基本上需要在数组中逐渐减少,并且似乎有一个额外的约束,被zeros
替换的那些仅来自现有的ones
集。要解决此问题,可以使用np.random.choice
并将其可选的arg replace
设置为False
,以获得每次迭代的唯一索引以分配zeros
并使用{{} 1}}每次迭代得到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
要为通用长度输入数组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
设置counts
数组,我们可以这样做 -
a
答案 1 :(得分:1)
这是一个简单的版本。它可以替代其他答案,并通过将元素随机设置为零来偏离指令,这是建议用于指数衰减而不是在每轮中删除确定性1/2。
这会打印每一轮的整个数组,但替代方案可能包括第一个元素print(a [0])或剩余数字print(a.sum())。
$(function() {
$('#toggleAccordions').on('click', function(e) {
$('#accordion .collapse').collapse('toggle')
})
});
答案 2 :(得分:1)
您希望实现它的方法是始终将剩余元素的50%准确设置为零。这意味着在每个时代中你总是会衰弱完全 50,25,12.5 ......元素。
但我不相信这是指数衰减过程的工作方式。
根据我的理解,您应该以概率p
将每个单独的元素设置为零。这意味着,对于每个时期的p = 0.5
概率,您将平均衰减50,25,12.5,......元素。
这种方法也大大简化了解决方案:
import numpy as np
x = np.ones(100)
p = .5 # probability of decay
for i in range(20):
mask = np.random.choice([True, False], size=len(x), p=[p, 1-p])
x[mask] = 0
如果速度是一个因素(但不是内存消耗),您还可以对此操作进行矢量化:
x = np.random.choice([-1, 0], size=(100, 20), p=[p, 1-p])
x = np.cumsum(x, axis=1)
x = x == 0
之后
x[:, n]
是n + 1
时代之后的人口
np.sum(x, axis=0)
是随时间变化的人口规模。
答案 3 :(得分:0)
这是你可以做到的一种方式。基本思想是创建索引数组[0,1,2,...,99],对该数组进行混洗,然后使用该数组中减小大小的切片作为SLAB_STORE_USER
的索引归零
a