【问题标题】:Reshape array in squares like an image像图像一样在正方形中重塑数组
【发布时间】:2018-02-07 13:39:14
【问题描述】:

我想在 python 中重塑一个数组(最初是一个 numpy 数组),使第一个索引处的每个元素都成为该数组中的一个正方形/象限,而不是采用一行中的所有元素的常规重塑。

这是一次重塑+重组。

当然,这是最快/更好的方法:)

(首选python 3.5)


使用形状为行、列、通道的数组。

例如,我创建了这个数组,您可以将其解释为图像。我已经为其添加了值,因此我们可以清楚地看到每个元素属于哪个行、列和通道:

import numpy as np

X = np.zeros((8,6,3)) #8 rows, 6 columns, 3 channels (imagine RGB channels)
for i in range(3):
    X[:,:,i] += i+1   #the last digit in the array elements are channels
for i in range(6):
    X[:,i,:] += 10*(i+1)  #the second digit in elements are columns
for i in range(8):
    X[i,:,:] += 100*(i+1) #the first digit in elements are rows  

打印这个数组显示:

[[[ 111.  112.  113.]
  [ 121.  122.  123.]
  [ 131.  132.  133.]
  [ 141.  142.  143.]
  [ 151.  152.  153.]
  [ 161.  162.  163.]]

 [[ 211.  212.  213.]
  [ 221.  222.  223.]
  [ 231.  232.  233.]
  [ 241.  242.  243.]
  [ 251.  252.  253.]
  [ 261.  262.  263.]]
 ...
  • 因此,很明显第一个索引被分组为图像行(每个更大的组中的第一个数字都是恒定的)
  • 第二个索引是列,它们在大的每个较小的组中变化
  • 最后一个索引是通道,它们会单独更改,在较小的组中逐个元素地变化。

常规重塑不满足我的条件

现在,假设我想将该数组重塑为 12 个正方形,每个正方形为 2 x 2(两行两列),将通道保持为最后一个维度。

如果我只是 print(X.reshape(12,2,2,3)),我会得到这个:

[
    [
        [
            [ 111.  112.  113.]
            [ 121.  122.  123.]
        ]
        [
            [ 131.  132.  133.]
            [ 141.  142.  143.]
        ]
    ]
    [
        [
            [ 151.  152.  153.]
            [ 161.  162.  163.]
        ]
        [
            [ 211.  212.  213.]
            [ 221.  222.  223.]
        ]
    ]

....

第一个索引将第一行的所有元素分组(它们从 1 开始)。因此,它不是在图像中采用“正方形”,而是将事物分组成一条直线。在第 1 行的所有列都被取走之前,它永远不会从第 2 行取元素。


预期结果

如何正确有效地重塑它,以便第一个索引返回正方形(2 行,2 列),如下所示:

[
    [
        [
            [ 111.  112.  113.]
            [ 121.  122.  123.]
        ]
        [
            [ 211.  212.  213.]
            [ 221.  222.  223.]             
        ]
    ]
    [
        [
            [ 131.  132.  133.]
            [ 141.  142.  143.]
        ]
        [
            [ 231.  232.  233.]
            [ 241.  242.  243.]                
        ]
    ]
    [
        [
            [ 151.  152.  153.]
            [ 161.  162.  163.]
        ]
        [
            [ 251.  252.  253.]
            [ 261.  262.  263.]
        ]
    ]
    [
        [
            [ 311.  312.  313.]
            [ 321.  322.  323.]
        ]
        [
            [ 411.  412.  413.]
            [ 421.  422.  423.]
        ]
    ]

   ....

【问题讨论】:

    标签: python sorting numpy image-processing reshape


    【解决方案1】:

    你需要reshape + transpose/swapaxes + reshape:

    X.reshape(4,2,3,2,3).swapaxes(1,2).reshape(12,2,2,3)
    

    给予:

    array([[[[ 111.,  112.,  113.],
             [ 121.,  122.,  123.]],
    
            [[ 211.,  212.,  213.],
             [ 221.,  222.,  223.]]],
    
    
           [[[ 131.,  132.,  133.],
             [ 141.,  142.,  143.]],
    
            [[ 231.,  232.,  233.],
             [ 241.,  242.,  243.]]],
    
    
           [[[ 151.,  152.,  153.],
             [ 161.,  162.,  163.]],
    
            [[ 251.,  252.,  253.],
             [ 261.,  262.,  263.]]],
    
    
           [[[ 311.,  312.,  313.],
             [ 321.,  322.,  323.]],
    
            [[ 411.,  412.,  413.],
             [ 421.,  422.,  423.]]],
    

    【讨论】:

      猜你喜欢
      • 2016-05-20
      • 2019-09-18
      • 1970-01-01
      • 2021-04-18
      • 2014-05-03
      • 1970-01-01
      • 2023-02-14
      • 1970-01-01
      • 2017-06-11
      相关资源
      最近更新 更多