Python随机抽取两个数组,但保持索引匹配

31
我有两个numpy数组x和y,长度均为10,000。 我想绘制x和y的随机子集,每个子集包含1,000个条目。 是否有一种简单的方法,可以在x和y上使用精简随机抽样函数random.sample(population, k)来选择相应的索引?(假设y和x向量通过一个函数y(x)相互关联。)
谢谢。
4个回答

61
你可以在索引数组上使用np.random.choice,并将其应用于两个数组:
idx = np.random.choice(np.arange(len(x)), 1000, replace=False)
x_sample = x[idx]
y_sample = y[idx]

1
非常感谢!我之前不知道可以这样调用数组的元素,即 x[idx]! - Cokes
1
使用普通数组并遇到“TypeError: only integer scalar arrays can be converted to a scalar index”的人可能想使用以下代码:x_sample = list(np.array(x)[idx]) - Codoscope

9

将这两个文件压缩在一起,将其作为总体:

import random

random.sample(zip(xs,ys), 1000)

结果将会是从 xsys 对应的 1000 对二元组。

更新:对于 Python 3,你需要将压缩后的序列转换为列表:

random.sample(list(zip(xs,ys)), 1000)

在文档中,它说它只需要一个参数,即 _size_。https://docs.scipy.org/doc/numpy/reference/generated/numpy.random.sample.html 你能添加一个文档链接吗? - Sanghyun Lee
2
@SanghyunLee - 我的回答不使用numpy。https://docs.python.org/2/library/random.html#random.sample - DaoWen

1
使用 numpy.random.randint 函数,您可以生成一个随机数列表,这意味着您可以选择某些数据点两次。

1

在测试了 numpy.random.choice 解决方案后,我发现对于更大的数组它非常缓慢。

numpy.random.randint 应该会快得多。

示例:

x = np.arange(1e8)
y = np.arange(1e8)
idx = np.random.randint(0, x.shape[0], 10000)
return x[idx], y[idx]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接