ps 还是deeplung的代码,心情烦躁连测试都麻烦啊!!
遇到的问题简单来说就是当多维矩阵运算时候,脑袋不够用了想像不过来。
1.一个(72, 72, 108, 3, 5)矩阵A ,用12个(36,36, 36, 3, 5)矩阵B[0]到B[11]替换,B是一个矩阵列表。这个还比较好理解。
for iz in range(2):
for ih in range(2):
for iw in range(3):
sz = iz * 36
ez = (iz + 1) * 36
sh = ih * 36
eh = (ih + 1) * 36
sw = iw * 36
ew = (iw + 1) * 36
ii=iz*(2*3)+ih*3+iw
A[sz:ez, sh:eh, sw:ew] = B[ii]
2.比较难的是(72, 1, 1, 1)矩阵A,(72, 72, 108, 3)矩阵B,(1,1,1,3)矩阵C。
然后代码中有一段A+B*C的操作这里面的是矩阵对应位置相乘和相加的操作,而不是(1,3)×(3,1)=(1,1)这样的操作。具体发生了什么我们可以用以下代码来看看。
import numpy as np
c = -1 * np.ones((2, 2, 2, 3))
b = -1 * np.ones((1, 1, 1, 3))
e = np.arange(5,16,5)
f=e.reshape((1, 1, 1, -1))
h = np.ones((2,1,1,1))
print(f.shape)
d=c*b
g=c*f+h
print(d)
print(g)
(1, 1, 1, 3)
[[[[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]]]
[[[1. 1. 1.]
[1. 1. 1.]]
[[1. 1. 1.]
[1. 1. 1.]]]]
[[[[ -4. -9. -14.]
[ -4. -9. -14.]]
[[ -4. -9. -14.]
[ -4. -9. -14.]]]
[[[ -4. -9. -14.]
[ -4. -9. -14.]]
[[ -4. -9. -14.]
[ -4. -9. -14.]]]]
从最后的结果回推出简单可表述为B*C就是先将B看成72×72×108个 长度为3的数组,而C就是1×1*1个长度为3的数组,B的每个数组与C的那个数组对应位置相乘,再还原回去(72,72,108,3)即可。
而A+B*C就是类似,首先将B*C看成72×108×3个长度为72的数组,而A就是1×1*1个长度为72的数组,B*C的每个数组与A的那个数组对应位置相乘,在还原回去(72,72,108,3)即可。
总结,涉及到多维矩阵时候一定不要惊慌。其实不要将他们看的很复杂处理它们其实跟处理低维矩阵是一样的。比如A为(2,2,3,4)的矩阵,直接很难想象,你可一看成是2个(2,3,4)的矩阵按照一定顺序拼凑起来的,也可以看成是4个(2,2,3)矩阵按照一定顺序拼凑起来的。当然你还可以看成是2*3*4个长度为2的数组按照一定顺序拼凑起来的。
多维矩阵也就那样,希望这篇博客对你有所帮助.