首页 > 解决方案 > 1d numpy 数组到矩阵中的块

问题描述

我有一个 1D 数组,我需要将其reshape()转换为 2D 数组,但是重塑很棘手,因为似乎需要某种分组。

我尝试了几个不同系列的 reshape() 和 transpose() 组合,但我还没有找到正确的值排列方式。

我在下面提供了两个数组。我想重塑 1D 数组a以具有与 2D 数组相同的形状b。这个技巧的原因是我想要中间的 4 个。我做了一些尝试,为每 4 个值制作 2x2 块,然后排列到 6x6 数组中,但我没有成功。

a = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

b = np.array([
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 1, 1, 0, 0],
    [0, 0, 1, 1, 0, 0],
    [0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 0, 0]])

这里是形状

> a.shape                                                                          
(36,)                                                                                
> b.shape                                                                          
(6, 6)   

标签: pythonarraysnumpy

解决方案


这样做:

In [327]: a = np.array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0,
     ...:  0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
     ...: 
In [328]: a.reshape(3,3,2,2)
Out[328]: 
array([[[[0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0]]],


       [[[0, 0],
         [0, 0]],

        [[1, 1],
         [1, 1]],

        [[0, 0],
         [0, 0]]],


       [[[0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0]]]])

1s 的 (2,2) 块是可见的,但我需要切换中间的 2 个维度:

In [329]: a.reshape(3,3,2,2).transpose(0,2,1,3)
Out[329]: 
array([[[[0, 0],
         [0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0],
         [0, 0]]],


       [[[0, 0],
         [1, 1],
         [0, 0]],

        [[0, 0],
         [1, 1],
         [0, 0]]],


       [[[0, 0],
         [0, 0],
         [0, 0]],

        [[0, 0],
         [0, 0],
         [0, 0]]]])

现在回到二维:

In [330]: a.reshape(3,3,2,2).transpose(0,2,1,3).reshape(6,6)
Out[330]: 
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])

reshape,transpose,然后是reshape的基本步骤对于这类问题是常见的。转调很详细。


推荐阅读