我想创建 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 不是一个相等的数字。
干杯
使用
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) 对