是否有一种有效的方法来创建任意的长numpy数组,其中每个维度都由从长度列表中提取的元素组成?列表中的每个元素只能为每个维度绘制一次。
例如,如果我有列表l = ['cat', 'mescaline', 'popcorn']
,我希望能够创建一个数组array([['cat', 'popcorn'], ['cat', 'popcorn'], ['mescaline', 'cat']])
,例如通过键入np.random.pick_random(l, (3, 2), replace=false)
。
谢谢你。
Tags:
下面是一种使用numpy的方法
np.random.randint
:编辑:在每个元素在每行最多出现一次的附加详细信息之后
这不是很节省空间,你需要更好的吗?
有几种方法可以做到这一点,每种方法都有其优缺点,下面四种方法 从我的头顶。。。
random.sample
很简单,而且是内置的,尽管它可能不是最快的。。。numpy.random.permutation
同样简单,但它创建了一个我们必须分割的副本,哎哟!numpy.random.shuffle
因为它在适当的位置进行了洗牌,所以速度更快,但是我们仍然需要进行切片。numpy.random.sample
是最快的,但它只在0到1之间工作,所以我们有 将其规范化,并将其转换为int以获得随机索引,最后我们 仍然需要切片,注意规格化到我们想要的大小不会生成均匀的随机分布。以下是一些基准。
结果是:
所以看起来
numpy.random.permutation
是最糟糕的,这并不奇怪,Python拥有自己的random.sample
是拥有自己的,所以看起来它是numpy.random.shuffle
和numpy.random.sample
之间的一场势均力敌的竞赛,并且numpy.random.sample
逐渐消失,所以两者都应该足够了,尽管numpy.random.sample
内存占用率更高,但我还是喜欢它,因为我真的不需要构建数组,只需要随机索引。。。更新
不幸的是
numpy.random.sample
并没有从人群中提取出独特的元素,所以你会得到重新思考,所以坚持使用shuffle也一样快。更新2
如果您想留在numpy中利用它的一些内置功能,只需将值转换成numpy数组。
注意,这里的N相当大,因此你将得到重复的置换数,通过置换,我指的是值的顺序,而不是置换内的重复值,因为从根本上讲,任何给定的有限集上都有有限的置换数,如果只是计算整个集,那么它就是N!,如果只选择k个元素,则其n!/(n-k)!即使不是这样,也就是说我们的集合要大得多,我们仍然可能根据随机函数的实现而得到重复,因为shuffle/permutation/。。。等等,只使用当前集合,不知道总体,这可能是可以接受的,也可能是不可以接受的,这取决于你试图实现什么,如果你想要一组唯一的排列,那么你将生成该集合并对其进行子采样。
相关问题 更多 >
编程相关推荐