快速的numpy方式(垂直)重复二维数组的每一半 [英] Fast numpy way to repeat (vertically) each half of 2D array

查看:104
本文介绍了快速的numpy方式(垂直)重复二维数组的每一半的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

假定我们具有以下2D数组:

Assuming we have the following 2D array:

In [200]: a = np.arange(8).reshape(4,2)

In [201]: a
Out[201]:
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])

如何重复其中的每一半,所以我有以下2D数组:

How may repeat each half of it, so I have the following 2D array:

array([[0, 1],
       [2, 3],
       [0, 1],
       [2, 3],
       [4, 5],  # second half 
       [6, 7],
       [4, 5],
       [6, 7]])

我的尝试产生了错误的结果:

My attempt produces wrong result:

In [202]: np.tile(np.split(a, 2), 2).reshape(-1,2)
Out[202]:
array([[0, 1],
       [0, 1],
       [2, 3],
       [2, 3],
       [4, 5],
       [4, 5],
       [6, 7],
       [6, 7]])


推荐答案

将第一个轴拆分为两个给我们3D阵列,然后沿冷杉重复t,最后重塑为2D-

Reshape to split the first axis into two giving us a 3D array, then repeat along the first and finally reshape back to 2D -

np.repeat(a.reshape(-1,2,2),2,axis=0).reshape(-1,2)

泛化它-

def repeat_blocks(a):
    N = a.shape[0]
    B = N//2 # Block length
    R = 2 # number of repeats
    out = np.repeat(a.reshape(N//B,B,-1),R,axis=0).reshape(N*R,-1)
    return out

样本运行-

案例1:

In [120]: a
Out[120]: 
array([[0, 1],
       [2, 3],
       [4, 5],
       [6, 7]])

In [121]: repeat_blocks(a)
Out[121]: 
array([[0, 1],
       [2, 3],
       [0, 1],
       [2, 3],
       [4, 5],
       [6, 7],
       [4, 5],
       [6, 7]])

案例2:

In [123]: a
Out[123]: 
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

In [124]: repeat_blocks(a)
Out[124]: 
array([[ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 0,  1],
       [ 2,  3],
       [ 4,  5],
       [ 6,  7],
       [ 8,  9],
       [10, 11],
       [ 6,  7],
       [ 8,  9],
       [10, 11]])

这篇关于快速的numpy方式(垂直)重复二维数组的每一半的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆