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

2024-04-23 15:20:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我想把3D矩阵的所有元素(W*H)加起来,存储在一维矩阵中,长度=深度(输入矩阵的第三维)

我想说清楚: 输入尺寸=1D,形式为(W*H*D)。 所需输出=1D,长度=D

让我们考虑下面的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.

谢谢


Tags: intestimagelayerforoutputdefrange
2条回答

如果你的矩阵是按照你的帖子所暗示的那样设置的,那么你的“3D”矩阵就是一个数组:

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)]

Numpy非常适合对一维和多维数据进行切片和操作。它是快速,易于使用和非常“Python”。你知道吗

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

>>> 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]]])

现在加上jusingnumpy.sum数,给出要添加的维度(在本例中,维度1和2(维度为0索引):

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

仅用一句话概括一下,您可以这样做(问题中的变量名):

>>> 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>)

Sum of array elements over a given axis.

Parameters:

a : array_like Elements to sum.

axis : None or int or tuple of ints, optional Axis or axes along which a sum is performed. The default, axis=None, will sum all of the elements of the input array. If axis is negative it counts from the last to the first axis.

New in version 1.7.0.: If axis is a tuple of ints, a sum is performed on all of the axes specified in the tuple instead of a single axis or all the axes as before.

相关问题 更多 >