Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将3D矩阵的(W*H)求和并存储在长度=深度(输入矩阵的第三维)的一维矩阵中_Python_Python 2.7 - Fatal编程技术网

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

Python 如何将3D矩阵的(W*H)求和并存储在长度=深度(输入矩阵的第三维)的一维矩阵中,python,python-2.7,Python,Python 2.7,我想将3D矩阵的所有元素(W*H)相加,并将其存储在一维矩阵中,长度=深度(输入矩阵的第三维) 我要说清楚: 以(W*H*D)的形式输入尺寸=1D。 所需输出再次为1D,长度为D 让我们考虑下面的3D矩阵:2×3×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):

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

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

让我们考虑下面的3D矩阵:2×3×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)
>>> img3d[0,:,:]
array([[1, 2, 3],
       [4, 5, 6]])
我知道这会将输入数组原样复制到输出数组。 此外,输出数组长度不等于深度

有人请帮我把这个弄对

   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.

如果您的矩阵是按照您的帖子所暗示的那样设置的,并且您的“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))
如果三维矩阵作为真实三维对象设置为:

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

如果您的矩阵设置为您的帖子所暗示的矩阵,则将“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))
如果三维矩阵作为真实三维对象设置为:

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
非常适合于对一维和多维数据进行切片和操作。它速度快,使用方便,非常“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列。您可以像这样使用索引进行切片:

 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)
>>> img3d[0,:,:]
array([[1, 2, 3],
       [4, 5, 6]])
要从3D转换为1D,只需使用:

相反,使用:

现在添加jusing numpy.sum,给出要添加的维度(在您的示例中,维度1和2(维度为0索引):

仅用一行代码进行总结,您可以执行以下操作(问题中的变量名):

从:

numpy.sum

sum(a,axis=None,dtype=None,out=None,keepdims=numpy.\u globals.\u NoValue>)

给定轴上数组元素的总和

参数:

a:要求和的类数组元素

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

版本1.7.0中新增:如果axis是整数的元组,则执行求和 在元组中指定的所有轴上,而不是在单个轴或 所有的轴都和以前一样

非常适合于对单个和多维数据进行切片和操作。它速度快,易于使用,非常“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列。您可以使用如下索引进行切片:

 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)
>>> img3d[0,:,:]
array([[1, 2, 3],
       [4, 5, 6]])
要从3D转换为1D,只需使用:

相反,使用:

现在添加jusing numpy.sum,给出要添加的维度(在您的示例中,维度1和2(维度为0索引):

仅用一行代码进行总结,您可以执行以下操作(问题中的变量名):

从:

numpy.sum

sum(a,axis=None,dtype=None,out=None,keepdims=numpy.\u globals.\u NoValue>)

给定轴上数组元素的总和

参数:

a:要求和的类数组元素

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

版本1.7.0中新增:如果axis是整数的元组,则执行求和 在元组中指定的所有轴上,而不是在单个轴或 所有的轴都和以前一样


如果每一层只是一个列表,你能不能对每一层使用
sum
?@ScottHunter,输入不是一个列表,它是1D数组,必须计算1D,将其视为3D矩阵,提供w,h,c@kzs:调整我的答案以考虑1D输入数组。列表和1D数组(在Python中)有什么区别?如果每一层只是一个列表,你能不能对每一层使用
sum
。@ScottHunter,输入不是一个列表,它是1D数组,必须计算1D,将其视为3D矩阵,提供w,h,c@kzs:调整我的答案以考虑1D输入数组。列表和1D数组(在Python中)有什么区别?我已在编辑部分更新了输入矩阵的详细信息。您所解释的方法是针对二维、三维矩阵的。我忘记了前面提到的输入。@kzs查看我的编辑,我根据您的输入添加了一个建议。@kzs很高兴它起到了作用。我修复了代码中的一些拼写错误,并添加了一个大大简化的方法。我已更新了详细信息编辑部分输入矩阵的ails。您解释的方法适用于2D、3D matr