我想计算一个数组的随机子集的列表,其中子集的顺序是随机的,并且各自子集中的每个元素都是唯一的,我想高效地做到这一点(就时间和空间而言)。] >
例如,带有某些参数[1,2,3,4,5]
和k=3
的数组n=5
应该产生矩阵
元素的列表。[[4,3,1], [1,2,5], [2,4,5], [3,2,5], [2,3,1]]
即,我们从数组中获得
n=5
个带有k=3
个随机unique
我希望此速度尽可能快,而不创建巨大的可能组合查询表,因为时间和空间都是至关重要的。
我试图用numpy.random.choice(array,n*k).reshape((n,k))
做到这一点,除了唯一性部分,它几乎可以满足我的要求。我决定了以下内容
subsets = numpy.zeros(n).reshape((n,1)) subsets = numpy.apply_along_axis(lambda x: numpy.random.choice(array, k, replace=False),1, subsets)
但是由于这不是纯粹的麻木,这很慢。我的申请太慢了。有什么方法可以改善运行时,也许可以通过纯粹的numpy命令来实现?
任何帮助将不胜感激。
我想计算一个数组的随机子集的列表,其中子集的顺序是随机的,并且它们各自子集中的每个元素都是唯一的,我想高效地做到这一点(根据...
假设k
会比n
小得多,您可以在不进行替换的情况下实施采样:
idx = np.random.randint([5,4,3], size=[5,3])
idx[:,2:] += idx[:,2:] >= idx[:,1,None]
idx[:,1:] += idx[:,1:] >= idx[:,0,None]
np.array([1,2,3,4,5])[arr]
考虑到您的数字,一种好的方法是简单地用替换进行抽签,并丢弃重复的抽签。
N = [1, 2, 3, 4, 5]
k = 3
n = 5
arr = np.array([N] * n)
arr
array([[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5],
[1, 2, 3, 4, 5]])
[np.random.shuffle(i) for i in arr]
arr
array([[3, 5, 1, 2, 4],
[5, 1, 3, 2, 4],
[3, 5, 2, 4, 1],
[4, 5, 1, 2, 3],
[1, 5, 3, 2, 4]])
arr[:, :3]
array([[3, 5, 1],
[5, 1, 3],
[3, 5, 2],
[4, 5, 1],
[1, 5, 3]])