【问题标题】:Fill in numbers in a numpy array in sets of 1024以 1024 为一组填充 numpy 数组中的数字
【发布时间】:2017-07-24 22:46:55
【问题描述】:

我有一个大型 numpy 数组,其中元素增加如下

A = [512,2560,3584,5632,....]

元素总是至少相隔 1024

假设我需要将上面的数组转换为下面的数组,其中对于原始矩阵 A 的每个元素,我采用从 A[n]A[n]+1024 的一系列值(以一个为单位),这些值变为新矩阵的值如下

A2 = [512,513,514,...,1535,2560,2561,2562,...3583,....]

我设置问题的方法是遍历原始矩阵 A,生成A[0]A[0]+1024 之间的值范围(例如),将它们分配给新数组等等。代码如下。约定是 A 作为原始种子矩阵

seed = 0
A2 = np.empty(len(A)*1024,)
for ind in range(len(A)):
    A2[seed:seed+1024] = np.arange(A[ind],A[ind]+1024)
    seed = seed+1024;

我得到了我需要的答案,但我想知道这是否是最好的方法。我是一名 matlab 用户,正在过渡到使用 python 和 numpy,但我还不习惯优化 numpy。我很感激任何帮助。

【问题讨论】:

    标签: python arrays numpy matrix


    【解决方案1】:

    你可以使用broadcasting -

    (A[:,None] + np.arange(1024)).ravel()
    

    示例运行 -

    # Input array
    In [433]: A = np.array([512,2560,3584,5632])
    
    # Add ranged numbers in a broadcasted way for elementwise addition   
    In [434]: A[:,None] + np.arange(1024)
    Out[434]: 
    array([[ 512,  513,  514, ..., 1533, 1534, 1535],
           [2560, 2561, 2562, ..., 3581, 3582, 3583],
           [3584, 3585, 3586, ..., 4605, 4606, 4607],
           [5632, 5633, 5634, ..., 6653, 6654, 6655]])
    
    # Finally flatten those for final output
    In [435]: (A[:,None] + np.arange(1024)).ravel()
    Out[435]: array([ 512,  513,  514, ..., 6653, 6654, 6655])
    

    或者np.add.outer -

    np.add.outer(A,range(1024)).ravel()
    

    等效的 MATLAB 版本:

    作为参考,MATLAB 版本利用等效的 broadcastingbsxfun 并记住列优先顺序,看起来会沿着这些方向 -

    >> A = [512,2560,3584,5632];
    >> sums = bsxfun(@plus, A, [0:1023].');
    >> [sums(1:3,1) ; sums(end-2:end,1)].'
    ans =
             512         513         514        1533        1534        1535
    >> [sums(1:3,2) ; sums(end-2:end,2)].'
    ans =
            2560        2561        2562        3581        3582        3583
    >> [sums(1:3,3) ; sums(end-2:end,3)].'
    ans =
            3584        3585        3586        4605        4606        4607
    >> [sums(1:3,4) ; sums(end-2:end,4)].'
    ans =
            5632        5633        5634        6653        6654        6655
    >> out = reshape(sums,1,[]);
    >> [out(1:3) out(end-2:end)]
    ans =
             512         513         514        6653        6654        6655
    

    【讨论】:

    【解决方案2】:

    你可以使用:

    (A.reshape(-1,1) + numpy.arange(1024)).reshape(-1)
    

    它的工作原理如下:

    1. 首先我们使用reshape(-1,1)得到一个n×1数组;
    2. 接下来我们使用广播将0到1024添加到每一行;和
    3. 然后我们将其重新整形为一维数组。

    【讨论】:

      猜你喜欢
      • 2018-05-07
      • 2022-12-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-06
      • 1970-01-01
      • 2020-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多