【问题标题】:Shuffle array such that the expected index of an element will be its original index随机排列数组,使得元素的预期索引将是其原始索引
【发布时间】:2020-12-06 13:50:13
【问题描述】:

考虑一个数组:

a=[0,1,2,3,4,5,6,...99]

我想对其进行洗牌,以使每个元素都有望在其开始的位置结束;即 0 预计将在位置 0 结束,1 预计将在位置 1 结束,2 预计将在位置 2 结束。

我也希望能够将其用于通用数组。


编辑:

我已经取得了一些进展,我认为由于问题引起了一些混乱,人们可能会发现这更容易。

a = ['a','b','c']
b = list(range(0,len(a)))
c = np.random.normal(0,1,len(a))
d = b+c
np.sort(d)

最后一行返回按 d 排序的 d。我想将a的元素按d排序。即,我想在此排序中将应用于 d 的任何映射应用于a

【问题讨论】:

  • 到目前为止您尝试了什么,请发布您的代码
  • 我对 python 还很陌生,所以我不能很快地做事情,但是你可以通过添加包含每个元素索引的第二行来获得正确的随机播放,添加一个正常分布的随机变量到该行中的每个元素,然后按第二行排序,然后将其删除。
  • 您能否详细说明您的问题。 “预期元素”是什么意思
  • ^ 为了更清楚,我重写了问题。
  • 当你不需要改变位置时你会洗牌吗?

标签: python random


【解决方案1】:

我想你在关注numpy.argsort。一个接近你所拥有的实现将是这样的:

import numpy as np

def nearsort(arr, *, amount=1):
    rv = np.random.normal(np.arange(len(arr)), amount)
    result = []
    for i in np.argsort(rv):
        result.append(arr[i])
    return result

amount 参数决定了物品可以移动的距离,较小的值使得大的重新排列不太可能。举个简单的例子,我们从以下地址返回['b', 'a', 'c']

np.random.seed(3)
nearsort(['a', 'b', 'c'])

请注意,项目可以任意移动,因此您可能希望使用不同的分布来获得更多控制权。例如,可以使用均匀分布(通过randint),或者可以使用choicep 指定的权重可以用于更多控制。例如:

def unisort(arr, *, pchange=0.1):
    weights = [pchange / 2, 1 - pchange, pchange / 2]
    rv = np.random.choice([-1.1, 0, 1.1], size=len(arr), p=weights)
    ii = np.argsort(np.arange(len(arr)) + rv)
    return [arr[i] for i in ii]

将确保项目不会移动太远。

【讨论】:

  • 我是 python 新手,你为什么在你的函数的第二个参数中放一个 *?
  • 它强制以下参数为keyword only
猜你喜欢
  • 1970-01-01
  • 2013-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多