Python 如何使用填充的0';s

Python 如何使用填充的0';s,python,arrays,numpy,reshape,Python,Arrays,Numpy,Reshape,我有一个Numpy数组,看起来像 array([1, 2, 3, 4, 5, 6, 7, 8]) array([[[ 5, 0, 0, 6], [ 0, 1, 2, 0], [ 0, 3, 4, 0], [ 7, 0, 0, 8]], [[13, 0, 0, 14], [ 0, 9, 10, 0], [ 0, 11, 12, 0], [15, 0,

我有一个Numpy数组,看起来像

array([1, 2, 3, 4, 5, 6, 7, 8])
array([[[ 5,  0,  0,  6],
        [ 0,  1,  2,  0],
        [ 0,  3,  4,  0],
        [ 7,  0,  0,  8]],

       [[13,  0,  0, 14],
        [ 0,  9, 10,  0],
        [ 0, 11, 12,  0],
        [15,  0,  0, 16]],
       ...
       [[93,  0,  0, 94],
        [ 0, 89, 90,  0],
        [ 0, 91, 92,  0],
        [95,  0,  0, 96]]])
我想把它重塑成一个数组

array([[5, 0, 0, 6],
       [0, 1, 2, 0],
       [0, 3, 4, 0],
       [7, 0, 0, 8]])
更具体地说,我正在尝试重塑2D numpy阵列,以获得一个3D numpy阵列

array([[ 1,  2,  3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14, 15, 16],
       [17, 18, 19, 20, 21, 22, 23, 24],
       ...
       [ 9, 10, 11, 12, 13, 14, 15, 16],
       [89, 90, 91, 92, 93, 94, 95, 96]])
到一个看起来像

array([1, 2, 3, 4, 5, 6, 7, 8])
array([[[ 5,  0,  0,  6],
        [ 0,  1,  2,  0],
        [ 0,  3,  4,  0],
        [ 7,  0,  0,  8]],

       [[13,  0,  0, 14],
        [ 0,  9, 10,  0],
        [ 0, 11, 12,  0],
        [15,  0,  0, 16]],
       ...
       [[93,  0,  0, 94],
        [ 0, 89, 90,  0],
        [ 0, 91, 92,  0],
        [95,  0,  0, 96]]])

使用numpy功能,特别是矢量化功能,有没有一种有效的方法来实现这一点?

我们可以使用
切片
-

def expand(a): # a is 2D array      
    out = np.zeros((len(a),4,4),dtype=a.dtype)
    out[:,1:3,1:3] = a[:,:4].reshape(-1,2,2)
    out[:,::3,::3] = a[:,4:].reshape(-1,2,2)
    return out
好处是内存,因此性能更好。效率,因为只有输出会占用内存空间。由于对输入和输出进行了切片,因此所涉及的步骤可以处理视图

样本运行-

二维输入:

In [223]: a
Out[223]: 
array([[ 1,  2,  3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14, 15, 16]])

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

       [[13,  0,  0, 14],
        [ 0,  9, 10,  0],
        [ 0, 11, 12,  0],
        [15,  0,  0, 16]]])
1D输入(以
None
输入2D扩展输入):


输入是否总是有8个元素?对于2D,每行8个元素?是的,输入有固定数量的元素。对于二维,这是每行(不是每列)8个元素。对于2D,我希望能够对任意数量的行执行此操作,尽管发布的解决方案对您有效吗?是的,它有效,谢谢!