有没有办法操纵随机播放功能?

时间:2019-07-31 06:53:19

标签: python random

我正在改组一个8760个数字的数组,这些数字按其各自的值(从低到高)排序,以生成准随机时间序列。但是,我希望较高的值在出现的数组的第一个季度和最后一个季度中出现的可能性更高,而在第二季度和第三季度中出现的值较低。 我的问题是:

  1. 是否有一种方法可以操纵随机播放功能,使其与自定义概率一起使用,还是我之后必须“自己动手”?
  2. 还有其他我不知道的软件包吗?
  3. 我可能会视而不见并忽略另一种更简单的方法吗?
a = np.array([0, 0, 0, 0, 0, ...
              1, 1, 1, ...
              ...
              14, 14, 14, 14, 14, 14])
a_shuff = random.shuffle(a)
# desired resultwould be something like 
a_shuff = [14, 14, 8, 12, ... 0, 4, 2, 6, 3, ... 13, 14, 9, 11, 12]

重要的是要注意,每个值在数组中出现的次数都不同。

我希望能够很好地描述我的问题-我对Python和Stackoverflow都是新手。我很乐意回答有关此问题的任何其他问题。

解决方案

通过按照答案中的建议对我的值进行排序,并沿轴对每个值应用递增的概率值(而sum(p)必须等于1),我能够成功使用Numpy的Random Choice函数。这可能不是我所问问题的答案,但是它起着同样的作用(至少在这种情况下如此):

#convert list to array (list was necessary previously)
v_time = np.empty(0)
for r in range(len(temp)):
    v_time = np.append(v_time, temp[r])

#sort values by desired probablity - this step may vary depending on desired #trend in shuffled data
arrayA = v_time[0::2]
arrayB = v_time[1::2]    
arrayB = np.flip(arrayB)
v_time = np.concatenate((arrayB, arrayA))

#create probability values for customizing your weights
p = np.linspace(0.01, 1, len(v_time))
p = p / sum(p)

#shuffle array
v_timeShuff = np.random.choice(v_time, v_time.size, False, p)

1 个答案:

答案 0 :(得分:0)

尽管大多数混洗功能是统一的,但已经实现了几种不统一的功能。例如,Rodrigo Agundez实现了Elitist Shuffle,在这种情况下效果很好。

另一种方法是将分位数拆分(已经排序,这很容易),在混洗期间,基于有偏见的选择在每一步进行绘制,其中较高的分位数具有较高的概率。