TensorFlow中图片预处理需要用到np.transpose的用法
这是引用别人的原创文章,记录学习用。
————————————————
版权声明:本文为CSDN博主「jeffery0207」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/jeffery0207/article/details/79411334
参数 a:输入数组
axis: int类型的列表,这个参数是可选的。默认情况下,反转的输入数组的维度,当给定这个参数时,按照这个参数所定的值进行数组变换。
返回值 p:ndarray 返回转置过后的原数组的视图。
import numpy as np
arr = np.arange(30).reshape(5, 6)
print(arr)
tran_arr = np.transpose(arr, axes=None)
print(tran_arr)
输出结果为:
[[ 0 1 2 3 4 5]
[ 6 7 8 9 10 11]
[12 13 14 15 16 17]
[18 19 20 21 22 23]
[24 25 26 27 28 29]]
[[ 0 6 12 18 24]
[ 1 7 13 19 25]
[ 2 8 14 20 26]
[ 3 9 15 21 27]
[ 4 10 16 22 28]
[ 5 11 17 23 29]]
这个结果意料之中,很好理解,就是线性代数的转置矩阵
2、再看看多维(三维为例)矩阵
a.首先,要明确坐标问题
np.arange(12).reshape(2, 2, 3)
(2, 2, 3) 分别代表 d, h, w
我们不妨继续看看:
arr = np.arange(12).reshape(2, 2, 3)
print(arr[1, 0, 0])
6
这下明白了吧,动手实践,多试几个
b. 接下来还要明白一个索引问题
形状 | 索引 |
---|---|
2 | 0 |
2 | 1 |
3 | 2 |
我们看看代码:
arr = np.arange(12).reshape(2, 2, 3)
print(arr)
tran_arr = np.transpose(arr, (1, 0, 2)) # (1, 0, 2)即为上面所说的索引号
print(tran_arr)
输出结果:
[[[ 0 1 2]
[ 3 4 5]]
[[ 6 7 8]
[ 9 10 11]]]
[[[ 0 1 2]
[ 6 7 8]]
[[ 3 4 5]
[ 9 10 11]]]
这样就实现了转置矩阵,但是对于初学者这个例子恐怕远远不够理解,我们换个例子你就懂啦!
arr = np.arange(24).reshape(3, 4, 2)
print(arr)
tran_arr = np.transpose(arr, (1, 0, 2))
print(tran_arr)
输出结果:
[[[ 0 1]
[ 2 3]
[ 4 5]
[ 6 7]]
[[ 8 9]
[10 11]
[12 13]
[14 15]]
[[16 17]
[18 19]
[20 21]
[22 23]]]
[[[ 0 1]
[ 8 9]
[16 17]]
[[ 2 3]
[10 11]
[18 19]]
[[ 4 5]
[12 13]
[20 21]]
[[ 6 7]
[14 15]
[22 23]]]
上面的shape 由(3,4,2)变成了(4,3,2),不就是因为索引号由(0,1,2)变成了(1,0,2)吗?
转置就是这么简单!