【问题标题】:Numpy reshape preserving some dimensionsNumpy重塑保留一些尺寸
【发布时间】:2017-11-23 19:56:23
【问题描述】:

我想要这个

# assume each 2x2 as assigned number on right

[[[False  True]            # 1  
  [False False]]

 [[False False]            # 2
  [False  True]]

 [[ True False]            # 3
  [False False]]

 [[False  True]            # 4
  [False False]]]

被改造成

[[[[False  True False False]
   [False False False  True]
   [ True False False  True]
   [False False False False]]]]

[[[[False  True | False False]                # 1 | 2
   [False False | False  True]                ___   ___
     ----------   -----------                  
   [ True False | False  True]                # 3 | 4
   [False False | False False]]]]

但我在使用arr.reshape(1,1,4,4)时得到了

[[[[False  True False False]                   # 1 flat
   [False False False  True]                   # 2 flat
   [ True False False False]                   # 3 flat
   [False  True False False]]]]                # 4 flat

请注意,每个 2x2 都是展平的。我希望 numpy 重塑形状,使 2x2 在调整之前的尺寸时保持不变。我该怎么做?


编辑: arr 的形状是 m,n,rm 可能是奇数

EDIT2:

案例 9x2x2 变成 1x1x6x6

我有什么:

[[[False False]
  [False  True]]

 [[False False]
  [False  True]]

 [[ True False]
  [False False]]

 [[False False]
  [False  True]]

 [[False False]
  [ True False]]

 [[False False]
  [ True False]]

 [[False  True]
  [False False]]

 [[False False]
  [ True False]]

 [[ True False]
  [False False]]]

预期:

[[[[False False | False False |  True False]
   [False  True | False  True | False False]
    -----------   -----------   ----------
   [False False | False False | False False]
   [False  True |  True False |  True False]
     ----------   -----------   -----------
   [False  True | False False |  True False]
   [False False |  True False | False False]]]]

我得到了什么:

[[[[False False False  True False False]          # 1 flattened; half of 2
   [False  True  True False False False]          # rem half of 2; flattened 3
   [False False False  True False  True]          # ...
   [False False False  True False False]
   [False False  True False False  True]
   [False False  True False False False]]]]

【问题讨论】:

  • 有了一个初始的 (4,2,2) 形状,并且只有 True/False 值,很难说出你想如何重塑事物。从每个维度的不同尺寸开始,例如(4,2,3) 和不同的值(例如数字)使映射更加明显和独特。
  • hpaulj,已更新 :) 希望现在清楚
  • 那么,如果采用这种分区方式,行数怎么可能不是 2 的倍数?
  • 更新了问题

标签: python numpy reshape


【解决方案1】:

难题的重要部分是第一个轴是一个平方数,我们将它除以那个平方根数,得到一个4D 数组。如果第一个轴不是平方数,我们将需要另一个输入参数,告诉我们在最终输出中沿列或行保留的块数。拆分后,交换轴12,最后reshape-

m = int(np.rint(np.sqrt(a.shape[0])))
out = a.reshape(m,m,2,2).swapaxes(1,2).reshape(m*2,-1)

示例运行 -

1] 输入:

In [69]: a
Out[69]: 
array([[[False, False],
        [False,  True]],

       [[False, False],
        [False,  True]],

       [[ True, False],
        [False, False]],

       [[False, False],
        [False,  True]],

       [[False, False],
        [ True, False]],

       [[False, False],
        [ True, False]],

       [[False,  True],
        [False, False]],

       [[False, False],
        [ True, False]],

       [[ True, False],
        [False, False]]], dtype=bool)

2] 输出:

In [70]: m = int(np.sqrt(a.shape[0]))

In [71]: a.reshape(m,m,2,2).swapaxes(1,2).reshape(m*2,-1)
Out[71]: 
array([[False, False, False, False,  True, False],
       [False,  True, False,  True, False, False],
       [False, False, False, False, False, False],
       [False,  True,  True, False,  True, False],
       [False,  True, False, False,  True, False],
       [False, False,  True, False, False, False]], dtype=bool)

【讨论】:

  • 只有最后两个维度 (2,2) 是已知的。我怎么想出reshape(?,?,2,2),因为我只能使用一个-1?事实上 arr 最初只是 3 维的:/
  • @SaravanabalagiRamachandran 更新帖子。
  • 我也想过 (-1,2,n,r),但它不适用于奇数。例如:9x2x2 将拒绝拆分为 (-1, 2, 2, 2)。如果我尝试 (-1,1,n,r) 我正在重塑最后一个暗淡 ://
  • @SaravanabalagiRamachandran 添加这样的案例和问题中的预期输出?
  • 这在技术上回答了我的需要:) 我只需要添加几个 if 来查找它是否是偶数,或者找到另一个相同的 hack :)
【解决方案2】:

在这种情况下使用einops

In: x

array([[[False, False],
        [False,  True]],

       [[False, False],
        [False,  True]],

       [[ True, False],
        [False, False]],

       [[False, False],
        [False,  True]],

       [[False, False],
        [ True, False]],

       [[False, False],
        [ True, False]],

       [[False,  True],
        [False, False]],

       [[False, False],
        [ True, False]],

       [[ True, False],
        [False, False]]])

In: einops.rearrange(x, '(h w) h2 w2 -> (h h2) (w w2)', h=3)

array([[False, False, False, False,  True, False],
       [False,  True, False,  True, False, False],
       [False, False, False, False, False, False],
       [False,  True,  True, False,  True, False],
       [False,  True, False, False,  True, False],
       [False, False,  True, False, False, False]])

参见einops docs,基本上它允许以显式方式编写各种重新排列。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-16
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 2011-02-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多