Numpy 2D数组在行之间而不是列之间随机播放元素

问题描述 投票:1回答:2

我有以下二维数组:

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]]

谢谢

python arrays numpy shuffle
2个回答
0
投票

您可以执行以下操作:

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%的机会被交换。


0
投票

我更喜欢这个:)

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]]"""
© www.soinside.com 2019 - 2024. All rights reserved.