我想总结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.
感谢
答案 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.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)]