numpy不可逆转地随机更改列表中的项目

时间:2017-12-15 09:37:52

标签: python numpy random

我有一个清单

a = np.ones(100)

我想将该列表中的50个随机项目变为0.一旦这些元素为0,我想将列表中剩余项目的25个随机元素变为0.在剩下的25个中,我想转13剩下的元素随机等零。

然后,我将通过一个简单的循环来运行它,例如(伪代码)“if item == 1,print red particle,else print blue particle”等。

这基本上是模拟指数衰减,但我很难想到算法来做到这一点。

这不是“Numpy:替换数组中的随机元素”的副本,因为一旦元素发生了变化,我不希望它们再次被考虑进行更改。

4 个答案:

答案 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