有没有办法操纵shuffle函数?

2024-04-25 22:57:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我洗牌一个数组,比如说,8760个数字,按它们各自的值排序(从低到高),生成一个准随机时间序列。但是,我希望更高的值在结果数组的第一个季度和最后一个季度中出现的几率更高,而在第二个季度和第三个季度中出现的几率更低。 我的问题是:

  1. 有没有一种方法可以操纵shuffle函数,使它以自定义的概率工作,还是我必须在之后“自己做”?你知道吗
  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都是新手。我很高兴回答关于这件事的任何进一步的问题。你知道吗

解决方案

通过按照答案中的建议对我的值进行排序,并沿轴对每个值应用递增概率值(而和(p)必须等于一),我能够成功地使用Numpy的随机选择函数。这可能不是我问的问题的答案,但是它做了同样的事情(至少在这个特定的情况下):

#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)

Tags: 方法答案time排序nprandom数组概率
1条回答
网友
1楼 · 发布于 2024-04-25 22:57:15

虽然大多数洗牌函数是统一的,但已经实现了几个非统一的函数。例如,Rodrigo Agundez实现了Elitist Shuffle,这在本例中非常有效。你知道吗

另一种方法是分成分位数(已经排序了,这很容易),在洗牌过程中,根据有偏的选择在每一步都画,其中分位数越高概率越高。你知道吗

相关问题 更多 >