指定大小的随机子集的清单

问题描述 投票:2回答:3

我想计算一个数组的随机子集的列表,其中子集的顺序是随机的,并且各自子集中的每个元素都是唯一的,我想高效地做到这一点(就时间和空间而言)。] >

例如,带有某些参数[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命令来实现?

任何帮助将不胜感激。

我想计算一个数组的随机子集的列表,其中子集的顺序是随机的,并且它们各自子集中的每个元素都是唯一的,我想高效地做到这一点(根据...

python arrays numpy random
3个回答
1
投票

假设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]

1
投票

考虑到您的数字,一种好的方法是简单地用替换进行抽签,并丢弃重复的抽签。


0
投票
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]])
© www.soinside.com 2019 - 2024. All rights reserved.