我需要从一个杂音中采样一堆点对点。我希望每一对都包含两个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
作为矢量化操作,有没有很好的方法来完成此操作?
答案 0 :(得分:2)
要对没有替换的一对进行采样,可以使用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))
的样本。
答案 1 :(得分:0)
这是@ user2357112的解决方案:
def sample_indices(X, n=4):
pair_indices = np.random.randint(X.shape[0]**2, size=n)
pair_indices = np.hstack(((pair_indices // X.shape[0]).reshape((-1,1)), (pair_indices % X.shape[0]).reshape((-1,1))))
good_indices = pair_indices[:,0] != pair_indices[:,1]
return X[pair_indices[good_indices]]