【问题标题】:Split a 3D numpy array into smaller 3D arrays将 3D numpy 数组拆分为更小的 3D 数组
【发布时间】:2019-09-27 12:36:22
【问题描述】:

我有一个 3D np.array

arr = np.array([ 
                [ [0, 205, 25], [210, 150, 30], [0, 0, 0], [1, 2, 3], [4, 5, 6], [7, 8, 9] ],
                [ [0, 255, 0], [255, 40, 0], [0, 0, 200], [7, 8, 9], [10, 11, 12], [120, 51, 58] ],
                [ [0, 0, 30], [0, 40, 0], [200, 100, 20], [12, 13, 14], [15, 16, 17], [13, 78, 84], ],
                [ [0, 205, 25], [210, 150, 30], [0, 0, 0], [1, 2, 3], [4, 5, 6], [7, 8, 9] ],
                [ [0, 255, 0], [255, 40, 0], [0, 0, 200], [7, 8, 9], [10, 11, 12], [120, 51, 58] ],
                [ [0, 0, 30], [0, 40, 0], [200, 100, 20], [12, 13, 14], [15, 16, 17], [13, 78, 84], ],
                [ [0, 205, 25], [210, 150, 30], [0, 0, 0], [1, 2, 3], [4, 5, 6], [7, 8, 9] ],
                [ [0, 255, 0], [255, 40, 0], [0, 0, 200], [7, 8, 9], [10, 11, 12], [120, 51, 58] ],
                [ [0, 0, 30], [0, 40, 0], [200, 100, 20], [12, 13, 14], [15, 16, 17], [13, 78, 84], ],
              ])

我需要将其拆分为 3x2x3 3D 数组

[ [0, 205, 25], [210, 150, 30],    [0, 0, 0], [1, 2, 3],             [4, 5, 6], [7, 8, 9] ],
[ [0, 255, 0],  [255, 40, 0],      [0, 0, 200], [7, 8, 9],           [10, 11, 12], [120, 51, 58] ],
[ [0, 0, 30],   [0, 40, 0],        [200, 100, 20], [12, 13, 14],     [15, 16, 17], [13, 78, 84], ],

[ [0, 205, 25], [210, 150, 30],    [0, 0, 0], [1, 2, 3],             [4, 5, 6], [7, 8, 9] ],
[ [0, 255, 0],  [255, 40, 0],      [0, 0, 200], [7, 8, 9],           [10, 11, 12], [120, 51, 58] ],
[ [0, 0, 30],   [0, 40, 0],        [200, 100, 20], [12, 13, 14],     [15, 16, 17], [13, 78, 84], ],

[ [0, 205, 25], [210, 150, 30],    [0, 0, 0], [1, 2, 3],             [4, 5, 6], [7, 8, 9] ],
[ [0, 255, 0],  [255, 40, 0],      [0, 0, 200], [7, 8, 9],           [10, 11, 12], [120, 51, 58] ],
[ [0, 0, 30],   [0, 40, 0],        [200, 100, 20], [12, 13, 14],     [15, 16, 17], [13, 78, 84], ],

用我用空格选择的这些 3D 块获得一个 4D 数组。零元素必须是

[ 
    [[0, 205, 25], [210, 150, 30]],
    [[0, 255, 0], [255, 40, 0]],
    [[0, 0, 30], [0, 40, 0]] 
]

等等。

我已经阅读了this 的问题,但仍然不明白如何做到这一点(为什么我们需要重新整形、转置和重新整形,transpose() 中的数字多么神奇)。我可以尝试编写自己的函数,但我想知道如何以原生方式实现。

【问题讨论】:

  • 这是你想要的arr.reshape(9,2,3,3)吗?
  • @yatu,不,我想要 3D 数组而不是向量
  • 您想要 4D 数组还是 3D 数组列表?
  • @Valentino,4D nympy 数组
  • 在我看来,您想要的输出是 5D,形状为 (3,3,3,2,3)?

标签: python arrays numpy


【解决方案1】:

你可以重塑和转置它

arr.reshape(3, 3, 3, 2, 3).transpose(2, 0, 1, 3, 4)
# array([[[[[  0, 205,  25],
#           [210, 150,  30]],
# 
#          [[  0, 255,   0],
#           [255,  40,   0]],
# 
#          [[  0,   0,  30],
#           [  0,  40,   0]]],
# 
# 
#         [[[  0, 205,  25],
#           [210, 150,  30]],
# 
#          [[  0, 255,   0],
#           [255,  40,   0]],
# 
#          [[  0,   0,  30],
#           [  0,  40,   0]]],
# 
# 
# ...

【讨论】:

  • 你能解释一下这些数字吗?
  • 它们是您在问题中给出的数字。 -1 表示“从剩余的数字中推断出这个值”
  • 具体来说,阅读reshape的链接文档,它是“新形状应该与原始形状兼容。如果是整数,那么结果将是该长度的一维数组. 一个形状维度可以是-1。在这种情况下,该值是从数组的长度和剩余维度推断出来的。"
  • 我需要另一个订单。零元素必须是```[ [[[0, 205, 25], [210, 150, 30]], [[0, 255, 0], [255, 40, 0]], [[0, 0, 30], [0, 40, 0]] ]
  • @NilsWerner,太奇怪了。我有另一个出口 [[[ 0 205 25] [210 150 30] [ 0 0 0] [ 1 2 3] [ 4 5 6] [ 7 8 9]] [[ 0 255 0] [255 40 0] [ 0 0 200] [ 7 8 9] [ 10 11 12] [120 51 58]] ...]
猜你喜欢
  • 2017-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-03-10
  • 2021-12-29
  • 1970-01-01
  • 2016-06-01
  • 1970-01-01
  • 2018-07-05
相关资源
最近更新 更多