2017-03-04 6 views
0

私はk折りたたみ交差検証タスクのための折り畳みを構築するためにnumpy配列を使いたいと思っています。テストスライスを取り出すのは簡単ですが、テストスライスを省略して残りの配列を返す方法を理解することはできません。これを行う効率的な方法はありますか?numpy配列を使用してクロスバリデーションの折り目を生成できますか?

examples = range(50) 
classes = range(50) 
data = np.array(zip(classes,examples)) 
test_slice = data[5:10] 
train_on_remainder = ?? 
+0

いずれかの側でスライスを連結します。結果はコピーになります。 – hpaulj

答えて

1

あなたはそうのようにそれを設定できます。

test_slice, remainder = np.split(data.copy(), [test_size], axis=0) 
# run test 
remainder[:test_size], test_slice = test_slice, remainder[:test_size].copy() 
# run test 
remainder[test_size:2*test_size], test_slice = test_slice, remainder[test_size:2*test_size].copy() 

# etc. 

私はあなたがはるかに少ないコピーでそれを持つことができるとは思いません。

仕組み:

.  full set:   | 0 | 1 | 2 | 3 | 4 | 5 | 
     split (full copy)  /\ 
     tst/rem   | 0 |  | 1 | 2 | 3 | 4 | 5 | 
     run trial 
          | 1 | 2 | 3 | 4 | 5 | 
     swap tst and   ^| 
     first segment:   | v 
     (partial copy)  | 0 | 

     tst/rem   | 1 |  | 0 | 2 | 3 | 4 | 5 | 
     run trial 
          | 0 | 2 | 3 | 4 | 5 | 
     swap tst and    ^| 
     second segment:   | v 
     (partial copy)   | 1 | 

     tst/rem   | 2 |  | 0 | 1 | 3 | 4 | 5 | 
     run trial 
          | 0 | 1 | 3 | 4 | 5 | 
     swap tst and     ^| 
     third segment:     | v 
     (partial copy)    | 2 | 

などあなたはそれがほとんど文字通り倍にシフトして見ることができるように。完全なコピーをたくさん保存する。

1

通常、sklearnのtrain_test_split()が利用可能であれば、それは奇妙な質問です。

編集:別のアプローチは

r = np.arange(len(data)) 
trainX = data[r < 5 | r > 10] 

私はよく分からないが、この は、リストの内包表記を使用してインデクサーを構築しようとし、効率的な解決策になるかもしれません。当然の

def indx(n, test_slice): 
    return [x for x in range(n) if, x not in test_slice] 

test_slice = set(range(5, 10)) 
trainX = data[indx(len(data), test_slice))] 

あなたはあなたのsklearnのtrain_test_split()その利用可能な場合のような何かをする必要があります。

0
split = np.vsplit(data, np.array([5,10])) 

'''This will give you a list with 3 elements''' 

test_slice = split[1] 
train_slice = np.vstack((split[0],split[2])) 

[5] [6 6] [7 7] [8 8] [9,9]

[[0] [1] [2 2] [3 3] [4 4] [10 10] [11 11] [12 12] [13 13] [14 14] [16 16] [18 18] ... [47 47] 48 48] [49 49]

0

二つのアプローチ、1Dアレイで実証:

In [64]: data = np.arange(20) 
In [65]: test = data[5:10] 
In [66]: rest = np.concatenate((data[:5],data[10:]),axis=0) 
In [67]: rest 
Out[67]: array([ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 
In [68]: 
In [68]: mask = np.zeros(data.shape[0], dtype=bool) 
In [69]: mask[5:10] = True 
In [70]: test = data[mask] 
In [71]: rest = data[~mask] 
In [72]: rest 
Out[72]: array([ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 

In [75]: np.delete(data, np.arange(5,10)) 
Out[75]: array([ 0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]) 

np.delete関数は内部的には私が実証され2つの方法のいずれかを使用していますがあります。

関連する問題