2015-09-05 4 views
0

У меня есть список массива в Pythonразделить случайным образом список массива в Python

import numpy as np 
mylist = [np.random.randint(0, i, int(10)) for i in (10,100,3)] 
[array([5, 5, 7, 2, 0, 5, 7, 8, 6, 9]), array([42, 70, 30, 62, 44, 8, 40, 68, 46, 93]), array([0, 0, 0, 0, 0, 1, 2, 0, 1, 2])] 

я хотел бы разделить (если это возможно случайно), например, 50% в двух списках

list_one = [array([5, 5, 7, 2, 0]), array([42, 70, 30, 62, 44]), array([0, 0, 0, 0, 0])] 
list_two = [array([5, 7, 8, 6, 9]), array([8, 40, 68, 46, 93]), array([1, 2, 0, 1, 2])] 

или 30% и 70%

list_one = [array([5, 5, 7]), array([42, 70, 30]), array([0, 0, 0])] 
list_two = [array([2, 0, 5, 7, 8, 6, 9]), array([62, 44, 8, 40, 68, 46, 93]), array([0, 0, 1, 2, 0, 1, 2])] 
+1

Так, например, вы хотите, чтобы случайно выбрать 50% от всех элементов, элементов и поместить их в один список, а остальные идут в другом списке ? Это просто, но утомительно. Сначала сгладьте список списков с помощью chain.from_iterable, затем для каждого элемента запустите random.uniform (0,1), и если результат меньше .5, поместите его в первый список, положив его во второй список. Для разделения 30:70 сделайте условие менее .3 для первого списка. Для менее предсказуемых результатов используйте random.SystemRandom(). Random(). –

+0

Вы хотите случайным образом выбрать точку разделения (т. Е. «Вырезать» массив на два) или случайным образом выбрать элементы (как в комментарии Триса Нефзгера)? Должен ли размер массивов в результирующих списках быть одинаковым (т. Е. Должны ли все элементы list_one быть одинаковой длины)? –

+0

привет, ребята, спасибо. Я желаю или сокращаю (если проще, потому что это уже случайные числа) случайного элемента выбора, если это не слишком сложно. Я сейчас пытаюсь найти элегантный способ решить эту утомительную проблему. –

ответ

1

Вы можете попробовать это:

from numpy.random import permutation 
from numpy import split 
ratio = 0.3 
l1, l2 = zip(*map(lambda x: split(permutation(x), [int(ratio*len(x))]), mylist)) 
print list(l1) 
print list(l2) 

, где используется операция перестановки, чтобы разбиение было рандомизировано, а расщепление явно выполняется с помощью процедуры numpy, так что код соответствует одной строке (хотя это может быть и не так важно ...).

Вход:

[array([3, 3, 7, 0, 0, 6, 6, 6, 6, 0]), 
array([54, 4, 28, 54, 34, 8, 28, 37, 0, 68]), 
array([2, 0, 0, 2, 1, 0, 2, 1, 2, 2])] 

Выход:

[array([6, 0, 3]), array([37, 54, 8]), array([0, 1, 2])] 
[array([0, 7, 6, 3, 6, 0, 6]), array([54, 28, 4, 28, 68, 0, 34]), array([2, 2, 0, 2, 2, 1, 0])] 
+0

wow compliment! –

Смежные вопросы