Skip to main content
 首页 » 编程设计

python之通过替换对 2D numpy 数组中的行进行采样

2025年05月04日10lhb25

numpy.random.choice是从一维数组中抽取随机元素的便捷工具:

In [94]: numpy.random.choice(numpy.arange(5), 10) 
Out[94]: array([3, 1, 4, 3, 4, 3, 2, 4, 1, 1]) 

但是文档指定a 参数必须 是一维的。但是,如果我想从二维数组中随机选择行(例如,单热编码器的随机样本),则不能再使用 numpy.random.choice。

所以如果我的输入是:

array([[ 1.,  0.,  0.], 
       [ 0.,  1.,  0.], 
       [ 0.,  0.,  1.]])   

我怎样才能从这个数组中随机获取 n 行,就像这样? (n = 10)

array([[ 0.,  0.,  1.], 
       [ 1.,  0.,  0.], 
       [ 0.,  0.,  1.], 
       [ 0.,  0.,  1.], 
       [ 1.,  0.,  0.], 
       [ 0.,  1.,  0.], 
       [ 1.,  0.,  0.], 
       [ 0.,  0.,  1.], 
       [ 1.,  0.,  0.], 
       [ 1.,  0.,  0.]]) 

请您参考如下方法:

根据 this问题,该功能是在 2014 年考虑的,但此后没有对 API 进行实质性添加。然而,有一个更好的解决方案巧妙地利用了 numpy.random.choice 和 numpy 的奇特索引:

开始于

In [102]: x = numpy.eye(3); x 
Out[102]:  
array([[ 1.,  0.,  0.], 
       [ 0.,  1.,  0.], 
       [ 0.,  0.,  1.]]) 

您可以使用 numpy.random.choice 生成随机索引列表,如下所示:

In [103]: i = numpy.random.choice(3, 10); i 
Out[103]: array([2, 2, 0, 2, 1, 1, 2, 0, 0, 1]) 

然后使用i索引x:

In [104]: x[i] 
Out[104]:  
array([[ 0.,  0.,  1.], 
       [ 0.,  0.,  1.], 
       [ 1.,  0.,  0.], 
       [ 0.,  0.,  1.], 
       [ 0.,  1.,  0.], 
       [ 0.,  1.,  0.], 
       [ 0.,  0.,  1.], 
       [ 1.,  0.,  0.], 
       [ 1.,  0.,  0.], 
       [ 0.,  1.,  0.]]) 

有了如此高效的解决方法,我认为没有必要更改 API。

请注意,对于生成具有特定概率分布的行,过程是相同的。指定指数本身的概率分布。