【问题标题】:Create numpy array with proper step and step range创建具有适当步长和步长范围的 numpy 数组
【发布时间】: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],...

标签: arrays numpy


【解决方案1】:

看起来每一行的选择都是独立的,取决于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]])

【讨论】:

  • 谢谢你,这会成功的:)。有没有更快的解决方案来做到这一点?我需要在主程序的每个循环中创建超过 10**6 行的数组。现在执行此操作的时间超过 50 秒。
猜你喜欢
  • 2016-05-13
  • 1970-01-01
  • 2017-02-26
相关资源
最近更新 更多