如何总结(W * H)三维矩阵并将其存储在长度=深度的一维矩阵中(输入矩阵的第三维)

时间:2017-07-11 16:25:55

标签: python python-2.7

我想总结3D矩阵的所有元素(W * H)并将其存储在长度=深度(输入矩阵的第三维)的1D矩阵中

让自己清楚: 输入维度= 1D,形式为(W * H * D)。 长度= D

时,所需输出= 1D

让我们考虑下面的3D矩阵:2 x 3 x 2.

 Layer 1       Layer 2
[1, 2, 3      [7, 8, 9
4, 5, 6]      10, 11, 12]

输出为1D:[21, 57]

我是python的新手并且写得像这样:

 def test(w, h, c, image_inp):
     output = [image_inp[j * w + k] for i in enumerate(image_inp)
         for j in range(0,h)
             for k in range(0,w)
                 #image_inp[j * w + k] comment
                 ]
     printout(output)

我知道这会将输入数组复制到输出数组。 输出数组长度也不等于深度。

有人请帮助我做正确的事

   def test(w, h, c, image_inp):
         output = [hwsum   for i in enumerate(image_inp)
                     hwsum += wsum for j in range(0,h)
                      wsum += image_inp[j*w + k] for k in range(0,w)
                     #image_inp[j * w + k]
                     ]
         print "Calling outprint"
         printout(output)

注意:我不想使用numpy(这个工作正常)或任何数学库。 原因是我在python中编写测试代码来评估语言的工作。

修改 输入矩阵将作为1D进入测试函数,w,h,c作为参数, 所以它采取以下形式:

[1,2,3,4,5,6,7,8,9,10,12],

with w, h, c have to compute considering input1D as 3D matrix.

感谢

2 个答案:

答案 0 :(得分:2)

Numpy非常适合切片和操作单维和多维数据。它快速,易于使用,非常“pythonic”。

按照你的例子,你可以这样做:

>>> import numpy
>>> img3d=numpy.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,12,12]]])
>>> img3d.shape
(2, 2, 3)

你可以在这里看到img3d有2层,2行和3列。你可以像这样使用索引进行切片:

>>> img3d[0,:,:]
array([[1, 2, 3],
       [4, 5, 6]])

要从3D转到1D,只需使用numpy.flatten()

>>> f=img3d.flatten()
>>> f
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 12, 12])

然后反过来,使用numpy.reshape()

>>> f.reshape((2,2,3))
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 12, 12]]])

现在添加jusing numpy.sum,给出你想要添加的尺寸(在你的情况下,尺寸1和2(尺寸为0索引):

>>> numpy.sum(img3d,(1,2))
array([21, 58])

只需在oneliner中进行总结,您就可以(您的问题中的变量名称):

>>> numpy.sum(numpy.array(image_inp).reshape(w,h,c),(1,2))

来自numpy manual on numpy.sum

  

<强> numpy.sum

     

numpy.sum(a,axis = None,dtype = None,out = None,keepdims = numpy._globals._NoValue&gt;)

     

给定轴上的数组元素的总和。

     

参数:

     

a:array_like要求的元素。

     

轴:无或int或   整数元组,可选轴或沿其执行求和的轴。   默认值axis = None将汇总输入的所有元素   阵列。如果轴为负,则从最后一轴到第一轴计数。

     

1.7.0版中的新功能。:如果axis是int的元组,则执行求和   在元组中指定的所有轴上,而不是单个轴或   所有的轴都像以前一样。

答案 1 :(得分:1)

如果您的广告设置为您的帖子暗示您的&#34; 3D&#34;矩阵作为数组的数组:

M = [ [1, 2, 3,
       4, 5, 6],
     [ 7, 8, 9,
      10,11,12],
]
array_of_sums = []
for pseudo_2D_matrix in M:
    array_of_sums.append(sum(pseudo_2D_matrix))

如果您的3D矩阵(作为真正的三维对象)设置为:

M = [
  [ [ 1, 2, 3],
    [ 4, 5, 6]
  ],
  [ [ 7, 8, 9],
    [10,11,12],
]

您可以通过执行以下操作来创建一维和数组:

array_of_sums = []
for 2D_matrix in M:
    s = 0
    for row in 2D_matrix:
        s += sum(row)
    array_of_sums.append(s)

有点不清楚您的数据是如何格式化的,但希望您能从这两个示例中了解到这一点。

修改

根据对输入的澄清,您可以轻松完成此任务:

如果尺寸w,h,c是作为数组[1,2,3,4,5,6,7,8,9,10,12]的尺寸突破给出的,那么您只需要将这些区域边界化并根据它进行求和:

input_array = [1,2,3,4,5,6,7,8,9,10,11,12]
w,h,c = 2,3,2
array_of_sums = []
i = 0
while i < w:
    array_of_sums.append(sum(input_array[i*h*c:(i+1)*h*c]))
    i += 1

作为简化方法:

def sum_2D_slices(w,h,c,matrix_3D):
    return [sum(matrix_3D[i*h*c:(i+1)*h*c]) for i in range(w)]