numpy.random.choice()从数组列表中的随机数组

时间:2017-11-23 20:05:41

标签: python arrays numpy random

我有类似lstB的数组列表,想要选择2D数组的随机集合。问题是,numpy不会以某种方式平等对待列表中的对象:

lstA = [numpy.array(0), numpy.array(1)]
lstB = [numpy.array([0,1]), numpy.array([1,0])]

print(numpy.random.choice(lstA))   # returns 0 or 1
print(numpy.random.choice(lstB))   # returns ValueError: must be 1-dimensional

对此有一个优雅的解决方法吗?

1 个答案:

答案 0 :(得分:1)

让我们称之为半优雅......

# force 1d object array
swap = lstB[0]
lstB[0] = None
arrB = np.array(lstB)
# reinsert value
arrB[0] = swap
# and clean up
lstB[0] = swap
# draw
numpy.random.choice(arrB)
# array([1, 0])

说明:遇到的问题似乎是将输入列表转换为数组时的numpy会使数组尽可能深。由于所有列表元素都是相同长度的序列,因此这将是2d。这里显示的hack强制它通过临时插入不兼容的元素来制作一个对象dtype的1d数组。

但是,我个人不会用这个。因为如果你使用这种方法绘制多个子数组,你将获得一个数组的数组,这可能不是你想要的,而且很难转换。

所以我实际上是第二个评论推荐的内容,即绘制整数然后使用高级索引到np.array(lstB)