【发布时间】:2018-06-22 10:02:11
【问题描述】:
大家好,我需要创建包含特定范围内的随机整数的特定数组。
输出需要这样:
[[0 3 2 1]
[1 2 0 3]
[2 0 3 1]
...
[10 7 8 9]]
每行的第一个数字需要是某个值[0,1,2,...]
行中接下来的 3 位数字需要从范围 (0,3) 的第一行(没有 0),(0,3) 的第二行(没有 1),(6,10) 的最后一个(没有 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
有什么加快速度的建议吗?
【问题讨论】:
-
您完全忽略了
3<n<6所在的有趣部分。 -
快速打字,已更正
-
那么“随机”基本上就是说他们的顺序是随机的?
-
Stefan,“是”随机数 = [3,2,1] 或 [2,1,3]
-
这不是随机的,而是随机的。随机将是
[3,3,1],[1,1,1],...