質問: **この質問の回答はすでにここにあります**: リストからランダムにデータを取り出して新たなデータリストを作りたい (2 件の回答) 5ヶ月前 にクローズされました。 私は、下記のような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つの値の数の塊として扱っています。
回答: 下記のサンプルコードでお望みの操作を達成できるでしょうか。 配列をランダムに並べ替えた後に先頭から任意個のペアを取得し、配列を`+`演算子で結合することができます。 別のご質問への @metropolis さんのコメントの方がエレガントに同様の結果を出せるのでサンプルコードに追記しました。 ``` 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']] など ```