python - Numpy 随机选择,仅沿一个轴替换

标签 python numpy random

我需要从一个数组中采样一堆点对。我希望每一对由两个 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/

相关文章:

java - 我可以在具有多个实例的类上使用 Random 方法吗?

c# - 如何生成总和为预定值的 N 个随机值?

python - 使用 yaml 进行 Prettier float

python - 如何使用 pygame 正确实现音频延迟测试

python - 快速索引 : Cython with numpy array of bool and str

python - pyOpenCL 与 numpy 相比得到不同的结果

python - 我可以通过更改算法来增加随机性吗?

python - 在Python单元测试中,SystemExit : False printed even though the test ran "OK"

python - 使用 django 创建个人资料页面

python - 将 NumPy 向量转换为二维数组/矩阵