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。
请注意,对于生成具有特定概率分布的行,过程是相同的。指定指数本身的概率分布。
