如何使用结构创建 Python 数组排列

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

我想创建 python 数组,第一列包含数字 1 到 42,第二列包含数字 1 和 3,但有特殊条件。我希望有 1,3 和 3,1 对。 我实际上得到了有效的代码,但速度相当慢。也许你们中的任何人都有更快的解决方案。

import numpy as np
import random

trials=np.linspace(1,42,42)
vec1=np.ones(21)
vec2=vec1+2
trial_types=np.concatenate((vec1,vec2))
isok=0
numb_run=1
while isok == 0:
    random.shuffle(trial_types)
    break_con = 0
    i=1
    while i <= len(trial_types):
        if trial_types[i] == trial_types[i - 1]:
            break_con = 1
        if break_con == 1:
            break
        i +=2
    numb_run+=1
    if break_con == 0:
        isok=1
print(trial_types)
print(numb_run)

我将相等的条目与不相等的条目进行洗牌并比较,看看它们是否相同。如果这准时发生,我会再次洗牌。但需要一些时间,直到通过这种随机化,我尝试创建的列看起来像这样:

[3. 1. 3. 1. 3. 1. 1. 3. 1. 3. 3. 1. 1. 3. 1. 3. 3. 1. 3. 1. 3. 1. 1. 3.
 3. 1. 1. 3. 3. 1. 1. 3. 3. 1. 3. 1. 3. 1. 3. 1. 3. 1.]
711799

正如您所看到的,需要 700K 的洗牌才能到达那里。 你有什么想法我可以让它更快吗? 我也尝试过某种 np.tile([1,3]) 和 np.tile([3,1]) 但不幸的是 42/4 不是一个相等的数字。

干杯

arrays numpy random permutation
1个回答
0
投票

使用

numpy

import numpy as np
pairs = np.array([[3,1], [1,3]])
pairs[np.random.randint(2,size=21)].flatten()
array([3, 1, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 3, 1, 1, 3, 1, 3,
       3, 1, 3, 1, 1, 3, 3, 1, 3, 1, 1, 3, 3, 1, 1, 3, 1, 3, 1, 3])

每次运行都会得到不同的结果,但仍然是 (3,1) 和 (1, 3) 对

© www.soinside.com 2019 - 2024. All rights reserved.