打乱数组,使元素的预期索引成为其原始索引

  • 本文关键字:索引 原始 数组 元素 python random
  • 更新时间 :
  • 英文 :


考虑一个数组:

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。我想得到按d排序的a的元素。即,我想得到在应用于CCD_ 3的排序中应用于d的任何映射。

我想你在追求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(,或者可以使用具有由p指定的权重的choice来进行更多的控制。例如:

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]

可以确保物品不会移动太远。

相关内容

最新更新