从列表列表中随机选择项目会产生ValueError

时间:2016-08-07 18:41:19

标签: python python-2.7 numpy nested-lists

我有一个函数,有时会给我一个列表列表,其中嵌套列表有时只有一个项目,例如这一个:

a = [['1'], ['3'], ['w']]

并希望从该主列表a中随机选择一个项目。如果我尝试在此列表中使用np.random.choice,我会收到ValueError: a must be 1-dimensional

但如果列表是:

b = [['1'], ['3'], ['w', 'w']]

然后使用np.random.choice完全正常。为什么是这样?我怎样才能这样做,以便我可以从两种类型的列表中随机选择?

2 个答案:

答案 0 :(得分:3)

我认为choice首先将您的列表转换为数组。

在第二种情况下,此数组是带有dtype对象的1d数组:

In [125]: np.array([['1'], ['3'], ['w', 'w']])
Out[125]: array([['1'], ['3'], ['w', 'w']], dtype=object)
In [126]: _.shape
Out[126]: (3,)

在第二个中,它创建了一个2d字符串数组:

In [127]: np.array([['1'], ['3'], ['w']])
Out[127]: 
array([['1'],
       ['3'],
       ['w']], 
      dtype='<U1')
In [128]: _.shape
Out[128]: (3, 1)

这是一个定期出现的问题。 np.array尝试在输入允许的情况下创建高维数组。

Prevent numpy from creating a multidimensional array

答案 1 :(得分:0)

回答&#34;如何使其发挥作用&#34;您可以使用的部分:

np.random.choice(np.squeeze(a))

请注意,这将取消a的方括号,但不会删除b的方括号。但可能仍然有用。