这里是矩阵的一些变换,因为涉及到处理图像处理,有RGB三通道,需要对3个矩阵进行操作,所以有3个矩阵的变化,所有stack和axis的概念,刚开始可能有点烧脑,但是多理解几遍就知道什么意思,即使你说不清楚,但至少懂得怎么变换。下面是一些例子,
a = np.arange(1, 7).reshape((2,3))
print(type(a))
b = np.arange(11, 17).reshape((2, 3))
c = np.arange(21, 27).reshape((2, 3))
d = np.arange(31, 37).reshape((2, 3))
print('a = \n', a)
print('b = \n', b)
print('c = \n', c)
print('d = \n', d)
a =
[[1 2 3]
[4 5 6]]
b =
[[11 12 13]
[14 15 16]]
c =
[[21 22 23]
[24 25 26]]
d =
[[31 32 33]
[34 35 36]]
print('axis = 0 ', s.shape, '\n', s)
s= np.stack((a, b, c, d), axis=0)
axis= 0 (4, 2, 3)
[[[ 1 2 3]
[ 4 5 6]]
[[11 12 13]
[14 15 16]]
[[21 22 23]
[24 25 26]]
[[31 32 33]
[34 35 36]]]
s = np.stack((a, b, c, d), axis=1)
print('axis = 1 ', s.shape, '\n', s)
axis =1 (2, 4, 3)
[[[ 1 2 3]
[11 12 13]
[21 22 23]
[31 32 33]]
[[ 4 5 6]
[14 15 16]
[24 25 26]
[34 35 36]]]
s = np.stack((a, b, c, d), axis=2)
print('axis = 2 ', s.shape, '\n', s)
axis= 2 (2, 3, 4)
[[[ 1 11 21 31]
[ 2 12 22 32]
[ 3 13 23 33]]
[[ 4 14 24 34]
[ 5 15 25 35]
[ 6 16 26 36]]]
a = np.arange(1, 10).reshape(3,3)
print(a)
[[1 23]
[4 5 6]
[7 8 9]]
b = a + 10
print(b)
[[1112 13]
[14 15 16]
[17 18 19]]
print(np.dot(a, b) #矩阵乘法
[[90 96 102]
[216 231 246]
[342 366 390]]
print(a * b) #按位乘法
[[ 11 24 39]
[ 56 75 96]
[119 144 171]]
a = np.arange(1, 10)
print(a)
[12 3 4 5 6 7 8 9]
b =np.arange(20,25)
print(b)
[20 21 22 23 24]
print(np.concatenate((a, b))) #数据相连
[ 1 2 3 4 5 6 7 8 9 20 21 22 23 24]
综上的例子,stack这个词就不要过多理解,语义上面是堆栈的意思,其实在Python中就当是个多维数组的变换函数(或者说是个数组的结合函数,结合的结果就是和axis有关),其实具体的功能体现还是得理解这个axis的含义。 axis的值是代表数组结合的时候,数据提取及组合的层次。别急,按上面的例子,3个数组进行结合变换,
当axis=0,代表取每个数组最高纬度的一层,就是数字自己本身,什么都不用变,把3个数组塞进一个新的数组就行了。
当axis=1,代表取每个数组元素的第二层,提取出来之后把每个数组的第二层元素组合成一个新数组。
当axis=2,代表取每个数组元素的第三层,提取出来之后把每个数组的第三层元素组合成一个新数组。
因为每个数组的层次是有限的,所以axis的数值也是有限的。比如上述例子的axis最大只能是2。但是这个层次怎么理解,其实就是把一个多维数组进行拆分知道最细颗粒级别,到不可再拆分的时候,axis就到极限值了,一般都不会大,多数都是5以内吧。如图这样,
0层就是外围最大的一层,计算方法也是把个数组直接排列在一起就行了。
1层就是0层下一层的具体元素,这里是一个一维数组。
2层就是1层的下一层具体元素,这里是1,4,7 ,已经是最具体的数字了,不能在下一层拆分了,随意axis最大就是2了。
领取专属 10元无门槛券
私享最新 技术干货