【问题标题】:Using reshape in Python to reshape an array在 Python 中使用 reshape 来重塑数组
【发布时间】:2013-10-29 05:41:36
【问题描述】:

我有一个如下所示的数组:

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

如何使用 reshape 将其分成 4 个夹头,使其看起来像

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

我在 reshape(m,n,l) 中尝试了 m、n、l 的不同整数组合,但没有任何效果。

【问题讨论】:

  • 你打算得到一个 3D 数组还是想要 2D 数组?

标签: python numpy shape reshape


【解决方案1】:

编辑:抱歉,我没有意识到这是 3-d 结果,而不是 4-d 结果。要获得 3-d 的,您将不得不再次重塑。而额外的重塑复制数据。

你不能,你也需要转置:

In [1]: a = np.arange(8)[:,None].repeat(8,axis=1)

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

In [3]: b = a.reshape(2,4,2,4)

In [4]: b
Out[4]: 
array([[[[0, 0, 0, 0],
         [0, 0, 0, 0]],
         ...
        [[7, 7, 7, 7],
         [7, 7, 7, 7]]]])

In [5]: b.transpose(0,2,1,3)
Out[5]: 
array([[[[0, 0, 0, 0],
         [1, 1, 1, 1],
         [2, 2, 2, 2],
         [3, 3, 3, 3]],

        [[0, 0, 0, 0],
         [1, 1, 1, 1],
         [2, 2, 2, 2],
         [3, 3, 3, 3]]],


       [[[4, 4, 4, 4],
         [5, 5, 5, 5],
         [6, 6, 6, 6],
         [7, 7, 7, 7]],

        [[4, 4, 4, 4],
         [5, 5, 5, 5],
         [6, 6, 6, 6],
         [7, 7, 7, 7]]]])

【讨论】:

    【解决方案2】:

    在所有 numpy 数组(实际上,所有数组(不是链表))下面都是线性内存块,您的解释赋予了更高维的性质。考虑它的方式是 element [i, j]really element [i * num_cols + j] 在底层数组中。

    Numpy 为您处理所有跨步细节,让您可以轻松地使用所需的维度索引到内存中,但是您有一个限制,即您只能将数据重新整形为可以编写规则的数组像上面的转换 (i,j) -> 单个索引,你想要的不是。

    有很多方法可以做你想做的事,但它们都涉及复制数据

    In [6]: array([[0, 0, 0, 0, 0, 0, 0, 0],
           [1, 1, 1, 1, 1, 1, 1, 1],
           [2, 2, 2, 2, 2, 2, 2, 2],
           [3, 3, 3, 3, 3, 3, 3, 3],
           [4, 4, 4, 4, 4, 4, 4, 4],
           [5, 5, 5, 5, 5, 5, 5, 5],
           [6, 6, 6, 6, 6, 6, 6, 6],
           [7, 7, 7, 7, 7, 7, 7, 7]]).reshape(-1, 4)[np.r_[range(0, 8, 2), range(1, 8, 2), range(8, 16, 2), range(9, 16, 2)]].reshape(4, 4, 4)
    Out[6]: 
    array([[0, 0, 0, 0],
           [1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [0, 0, 0, 0],
           [1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [4, 4, 4, 4],
           [5, 5, 5, 5],
           [6, 6, 6, 6],
           [7, 7, 7, 7],
           [4, 4, 4, 4],
           [5, 5, 5, 5],
           [6, 6, 6, 6],
           [7, 7, 7, 7]])
    

    或者假设你的数组在a

    In [10]: np.vstack([a[:4, :4], a[:4, 4:], a[4:, :4], a[4:, 4:]])
    Out[10]: 
    array([[0, 0, 0, 0],
           [1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [0, 0, 0, 0],
           [1, 1, 1, 1],
           [2, 2, 2, 2],
           [3, 3, 3, 3],
           [4, 4, 4, 4],
           [5, 5, 5, 5],
           [6, 6, 6, 6],
           [7, 7, 7, 7],
           [4, 4, 4, 4],
           [5, 5, 5, 5],
           [6, 6, 6, 6],
           [7, 7, 7, 7]]).reshape(4, 4, 4)
    

    或者只是

    np.array([a[:4, :4], a[:4, 4:], a[4:, :4], a[4:, 4:]])
    

    【讨论】:

    • @seberg 我对numpy的理解显然是有限的,你能指出一些细节吗?我假设当你创建新数组时(特别是在 vstack 期间)你最终会得到副本。
    • 基本上 numpy 使用跨步布局,这意味着您可以在不复制的情况下任意切片/转置。当您拆分尺寸时,Reshape 也永远不会复制(它可能需要以相反的方式复制)。在这里,你是对的,因为它是reshape + transpose + reshape,你需要一个副本。
    • @seberg 这就是我想说的。
    • 是的,对不起。问题是,你想要一个 2-D 输出,而我想要一个 4-d 输出:)...
    • 看起来 OP 真的想要 3D :-p
    猜你喜欢
    • 2021-02-15
    • 1970-01-01
    • 1970-01-01
    • 2019-10-17
    • 1970-01-01
    • 2012-02-09
    • 2021-06-05
    • 1970-01-01
    相关资源
    最近更新 更多