我有以下二维数组:
seq_length = 5
x = np.array([[0, 2, 0, 4], [5,6,7,8]])
x_repeated = np.repeat(x, seq_length, axis=1)
[[0 0 0 0 0 2 2 2 2 2 0 0 0 0 0 4 4 4 4 4]
[5 5 5 5 5 6 6 6 6 6 7 7 7 7 7 8 8 8 8 8]]
我想根据x_repeated
改组seq_length
,以便将seq的所有项目一起改组。
例如,可能的随机播放:
[[0 0 0 0 0 6 6 6 6 6 0 0 0 0 0 8 8 8 8 8]
[5 5 5 5 5 2 2 2 2 2 7 7 7 7 7 4 4 4 4 4]]
谢谢
您可以执行以下操作:
import numpy as np
seq_length = 5
x = np.array([[0, 2, 0, 4], [5, 6, 7, 8]])
swaps = np.random.choice([False, True], size=4)
for swap_index, swap in enumerate(swaps):
if swap:
x[[0, 1], swap_index] = x[[1, 0], swap_index]
x_repeated = np.repeat(x, seq_length, axis=1)
您还可以依靠True
不为零的事实,并用以下内容替换for
:
for swap_index in swaps.nonzero()[0]:
x[[0, 1], swap_index] = x[[1, 0], swap_index]
关键是我在np.repeat
调用之前进行了改组/交换,与之后进行(与您需要交换的值序列的要求相比)相比,这将效率更高。每对具有相同值的序列对都有50%的机会被交换。
我更喜欢这个:)
import random
import numpy as np
seq_length = 5
x = np.array([[0, 2, 0, 4], [5,6,7,8]])
x_repeated = np.repeat(x, seq_length, axis=1)
cnt = 0
frst_row = True
ref_lst_1 = [(lambda x: x_repeated[0][seq_length*x])(x) for x in range(0,4)] # [0, 2, 0, 4]
ref_lst_2 = [(lambda x: x_repeated[1][seq_length*x])(x) for x in range(0,4)] # [5, 6, 7, 8]
nlist=[]
while cnt < 8:
frst_row = int(not frst_row)
if frst_row == 0:
index = random.randint(0, len(ref_lst_1)-1)
num = ref_lst_1[index]
# print("ref_lst_1 : ", ref_lst_1)
ref_lst_1.pop(index)
if frst_row == 1:
index = random.randint(0, len(ref_lst_2)-1)
num = ref_lst_2[index]
# print("ref_lst_2 : ", ref_lst_2)
ref_lst_2.pop(index)
nlist = nlist+[num]*seq_length
cnt+=1
print(nlist)
"""[0, 0, 0, 0, 0, 5, 5, 5, 5, 5, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
0, 0, 0, 0, 0, 6, 6, 6, 6, 6, 2, 2, 2, 2, 2, 7, 7, 7, 7, 7]
"""
narray = np.array([nlist[0:19], nlist[20:39]])
print(narray)
"""[[0 0 0 0 0 5 5 5 5 5 4 4 4 4 4 8 8 8 8]
[0 0 0 0 0 6 6 6 6 6 2 2 2 2 2 7 7 7 7]]"""