

私は、下記のような100×3の行列リストを持っています。  
この行列に対して行いたい処理は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-04T00:37:47.507
73051
2021-01-04T01:44:06.147
42944
question
python numpy
リストからランダムに行を抽出し、新たな配列を配列を作りたい


下記のサンプルコードでお望みの操作を達成できるでしょうか。  
配列をランダムに並べ替えた後に先頭から任意個のペアを取得し、配列を`+`演算子で結合することができます。

[別のご質問](https://ja.stackoverflow.com/q/73047)への @metropolis
さんの[コメント](https://ja.stackoverflow.com/questions/73047/%e3%83%aa%e3%82%b9%e3%83%88%e3%81%8b%e3%82%89%e3%83%a9%e3%83%b3%e3%83%80%e3%83%a0%e3%81%ab%e3%83%87%e3%83%bc%e3%82%bf%e3%82%92%e5%8f%96%e3%82%8a%e5%87%ba%e3%81%97%e3%81%a6%e6%96%b0%e3%81%9f%e3%81%aa%e3%83%87%e3%83%bc%e3%82%bf%e3%83%aa%e3%82%b9%e3%83%88%e3%82%92%e4%bd%9c%e3%82%8a%e3%81%9f%e3%81%84#comment81130_73047)の方がエレガントに同様の結果を出せるのでサンプルコードに追記しました。

[code]

    import string
    import random
    
    # 下準備として ["a1", "a2", "a3"] から ["z1", "z2", "z3"] までの配列を作る
    arr = []
    for c in string.ascii_lowercase[:26]:
        arr.append([f"{c}{i}" for i in range(1, 4)])
    
    # ランダムに任意個の行を抽出する(3個)
    count = 3
    random.shuffle(arr) # 完全にランダムなシャッフルを行う
    rnd_arr = []
    for i in range(0, count * 2, 2): # 先頭から2つの行を任意個取り出す
        rnd_arr.append(arr[i] + arr[i + 1]) # 2つの行を1つの配列にまとめる
    print(rnd_arr)
    # [['e1', 'e2', 'e3', 'c1', 'c2', 'c3'], ['a1', 'a2', 'a3', 'x1', 'x2', 'x3'], ['z1', 'z2', 'z3', 'p1', 'p2', 'p3']] など
    
    # 追記(numpy版)
    import numpy as np
    rnd_nparr = np.random.permutation(arr)[0:count*2].reshape(3, 6)
    print(rnd_nparr)
    # [['r1' 'r2' 'r3' 'e1' 'e2' 'e3']
    #  ['x1' 'x2' 'x3' 's1' 's2' 's3']
    #  ['m1' 'm2' 'm3' 'b1' 'b2' 'b3']] など
    
[/code]


CC BY-SA 4.0
2021-01-04T01:44:06.147
73054
2021-01-04T01:44:06.147
9820
73051
answer