Случайный выбор элемента из списка списков дает ValueError

У меня есть функция, которая иногда дает мне список списков, где вложенные списки иногда имеют только один элемент, такой как этот:

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

И хотите случайным образом выбрать один элемент из этого основного списка a, Если я попытаюсь использовать np.random.choice в этом списке я получаю ValueError: a must be 1-dimensional,

Но если бы список был вместо:

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

Затем с помощью np.random.choice отлично работает Почему это? И как я могу сделать так, чтобы я мог случайным образом выбирать из обоих типов списков?

2 ответа

Я думаю choice сначала превращает ваш список в массив.

Во втором случае этот массив является 1d-массивом с объектом dtype:

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

Во втором он создает двухмерный массив строк:

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

Это проблема, которая периодически возникает. np.array пытается создать как можно больший размерный массив, насколько позволяет вход.

Предотвратить numy от создания многомерного массива

Чтобы ответить на часть "как заставить это работать", вы можете использовать:

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

Обратите внимание, что это устранит квадратные скобки для a, но не для b, Но все еще может быть полезным.

Другие вопросы по тегам