2015-09-05 71 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])] 

我希望分裂(如果可能隨機地)例如在兩個列表

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])] 

或50% 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()。 – 2015-09-05 04:57:23

+0

你想隨機選擇一個分割點(也就是將一個數組「剪切」爲兩個),還是隨機選取元素(如Tris Nefzger的評論中所述)?必須在結果列表中數組的大小是否相同(即,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

哇恭維! –