我需要从一个数组中采样一堆点对。我希望每一对由两个 DISTINCT 点组成,但这些点可能会在不同的对中重复。
例如,如果我的数组是 X=np.array([1,1,2,3])
, 然后:
>>> sample_pairs(X, n=4)
... [[1,1], [2,3], [1,2], [1,3]] # this is fine
>>> sample_pairs(X, n=4)
... [[1,1], [2,2], [3,3], [1,3]] # this is not okay
有没有一种好的方法可以将其作为矢量化操作来完成?
最佳答案
要在没有替换的情况下对一对进行采样,您可以使用 np.random.choice
:
np.random.choice(X, size=2, replace=False)
或者,要一次采样多个元素,请注意所有可能的对都可以由
range(len(X)*(len(X)-1)/2)
的元素表示。 ,并使用 np.random.randint
从中取样.combs = np.array(list(itertools.combinations(X, 2)))
sample = np.random.randint(len(combs), size=10)
combs[sample[np.newaxis]]
跟进@user2357112 的评论,根据 OP 自己的回答,他们似乎并不关心样本大小本身是否是确定性的,并注意到使用 Mersenne Twister 进行采样比基本算术运算慢,如果
X
是不同的解决方案太大以至于生成组合是不可行的sample = np.random.randint(len(X)**2, size=N)
i1 = sample // len(X)
i2 = sample % len(X)
X[np.vstack((i1, i2)).T[i1 != i2]]
这会产生一个平均大小为
N * (1 - 1/len(X))
的样本。 .
关于python - Numpy 随机选择,仅沿一个轴替换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51310009/