块状随机选择,仅沿一个轴替换

时间:2018-07-12 15:55:11

标签: python numpy

我需要从一个杂音中采样一堆点对点。我希望每一对都包含两个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

作为矢量化操作,有没有很好的方法来完成此操作?

2 个答案:

答案 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]]