考虑一个数组:
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]
可以确保物品不会移动太远。