使用适当的步长和步长范围创建numpy数组

时间:2018-06-22 10:02:12

标签: arrays numpy

您好,我需要创建特定的数组,其中包含具有一定范围的带步长的随机整数。

输出需要通过这样:

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

任何建议如何加快速度?

1 个答案:

答案 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]])