

私は、下記のような100×3の行列リストを持っています。

[![画像の説明をここに入力](https://i.stack.imgur.com/UmUKm.png)](https://i.stack.imgur.com/UmUKm.png)

この行列に対して行いたい処理は2つあります。

・ランダムに2つの行を抽出することを、任意の回数(例えば、3回)行いたい  
ex) [[a1, a2, a3],  
[b1, b2, b3]]  
・抽出した2つの行を1つの行になるように変更して、試行した回数×取り出した行の組という行列を作りたい  
[[a1, a2, a3, b1, b2, b3],  
[c1, c2, c3, d1, d2, d3],  
[e1, e2, e2, f1, f2, f3]]

追記  
最初の100×3の行列では、1行分の値、つまり、3つの値の数の塊として扱っています。


CC BY-SA 4.0
2021-01-03T14:36:26.683
73047
2021-05-16T08:21:14.893
2021-01-04T03:35:13.753
3060
42944
question
python numpy
リストからランダムにデータを取り出して新たなデータリストを作りたい


まず適当な行列

[code]

    a = np.array([[m*3 + n for n in range(3)] for m in range(20)])
    
[/code]

があった時

[code]

    b = a[np.random.choice(a.shape[0], 8, replace=False), :]
    
[/code]

でいけます。`a.shape[0]` で `a` の行サイズを取り出し `np.random.choice`
でインデックスの乱数を作ります。`replace=False` が重複なしにするオプションです。これで `a[n,:]`
という形で行を取り出すことが出来ます。


CC BY-SA 4.0
2021-01-03T14:57:45.147
73048
2021-01-03T14:57:45.147
39645
73047
answer


答えてくれている人のを参考に逐次処理で書いたものです。  
XとYを変えればある程度自由な値で作成できると思います。

[code]

    import numpy as np
    import random
    
    a = np.array([[m*3 + n for n in range(3)] for m in range(100)])
    
    # 任意の回数を決める
    X = 10
    # 抽出する行の個数を決める
    Y = 2
    
    ans = np.zeros((X,3*Y))
    for i in range(X):
        ans_list = np.array([])
        for _ in range(Y):
            ans_list = np.append(ans_list,a[random.randrange(100)])
        ans[i] = ans_list
    
    print(ans)
    
[/code]


CC BY-SA 4.0
2021-05-16T07:27:47.740
75870
2021-05-16T08:21:14.893
2021-05-16T08:21:14.893
3060
45327
73047
answer