您好,我需要创建特定的数组,其中包含具有一定范围的带步长的随机整数。
输出需要通过这样:
[[0 3 2 1]
[1 2 0 3]
[2 0 3 1]
...
[10 7 8 9]]
每行的第一位数字必须为特定值[0,1,2,...]
该行中的后3位数字必须从第一行(无0)的(0,3)
到第二行(无1)的(0,3)
,最后一个(无10)的(6,10)
随机。通常(x,y)没有固定数字,其中x =固定数字-4但不小于固定数字,y =固定数字+ 4但不大于固定数字。
随机数的范围必须是4位数字,并且不能在特定方向上重复。
另一种可视化效果: 固定数字= [0,1,2,3,..] 随机范围=(0,3)+偏移量
array range - without
[[0, random numbers in range] (0,3) - 0
[1, random numbers in range] (0,3) - 1
[2, random numbers in range] (0,3) - 2
...
[6, random numbers in range] (2,6) - 6
[7, random numbers in range] (3,7) - 7
...
[n, random numbers in range]] (n-4,n) - n
经过一些操作后,我在下面的代码中编写了代码,该代码相当快,但是我认为它可以做得越来越好。
def winning_matrix():
######## create beginning 4 vector array ########
# create vector with counts to merge
add_vector_beginning = np.arange(4)[:, None]
# create zeros array for data input
add_array = np.zeros(shape=(4, 3))
# fill up add array
add_array[0] = np.array([1, 2, 3])
add_array[1] = np.array([0, 2, 3])
add_array[2] = np.array([0, 1, 3])
add_array[3] = np.array([0, 1, 2])
# convert array values to integers
add_array = add_array.astype(int)
# mix array values
mix_array = np.zeros(shape=(4, 3))
for i in range(4):
mix_array[i] = np.random.choice(add_array[i], replace=False, size=3)
# convert array values to integers
mix_array_int = mix_array.astype(int)
# merge array with proper vector
add_matrix = np.column_stack((add_vector_beginning, mix_array_int))
#### create main winning array #######
# create add vector with proper count values
add_vector = np.arange(vectors_number - 4)[:, None] + 4
# create offset for main array
offset = np.arange(vectors_number - 4)[:, None] + 1
# create random array
winning_matrix_random = np.random.rand(vectors_number - 4, 3)
# convert random array values in array into positions intigers
winning_convert = winning_matrix_random.argsort(1)
# add offset to array
winning_matrix_raw = winning_convert + offset
# merge add vector with winning array
winning_matrix = np.column_stack((add_vector, winning_matrix_raw))
#### merge two created arrays into one #########
for i in range(4):
winning_matrix = np.insert(winning_matrix, i, add_matrix[i], axis=0)
return winning_matrix
任何建议如何加快速度?
答案 0 :(得分:0)
每行的选择似乎是独立的,具体取决于n
参数(或两个)。如果是这样,我将专注于编写在给定n
的情况下生成一行的函数。
为此行生成一个范围,例如x = np.arange(m, m+4)
,删除n
,然后执行np.random.choise(x, size=3, replace=False)
。我没有足够仔细地阅读您的描述以获取所有详细信息。
然后仅对每一行运行此函数,将结果累积在列表中。
def arow(n,m,k=4):
x = list(range(m,m+k))
i = x.pop(x.index(n))
y = np.random.choice(x, replace=False, size=3)
y = [i]+y.tolist()
return y
In [34]: arow(0,0,4)
Out[34]: [0, 1, 2, 3]
In [35]: arow(1,0,4)
Out[35]: [1, 2, 3, 0]
In [39]: arow(10,7,4)
Out[39]: [10, 8, 7, 9]
In [47]: k=4
...: alist = []
...: for n in range(11):
...: m = max(0,n-k+1)
...: r = arow(n,m,k)
...: alist.append(r)
...: np.array(alist)
Out[47]:
array([[ 0, 2, 3, 1],
[ 1, 0, 3, 2],
[ 2, 3, 1, 0],
[ 3, 1, 2, 0],
[ 4, 3, 2, 1],
[ 5, 4, 3, 2],
[ 6, 3, 4, 5],
[ 7, 6, 4, 5],
[ 8, 7, 6, 5],
[ 9, 8, 6, 7],
[10, 8, 9, 7]])