简介
在某些时候,比如调整图片的矩阵(长、宽、高)的顺序时就需要用到数组的转置和轴对换。转置是数组重塑的一种,它返回的是源数据的视图,也就是说不会对数组进行复制,改变的是原数组。
方法
数组不仅有transpose()
方法还有一个T
属性, 可以很方便的完成转置。
代码演示:
1 2 3 4 5 6 7 8 9 10 11 12 |
>>>import numpy as np >>>a = np.arange(12).reshape(3, 4) >>>a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>>a.T array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]]) |
通常在做矩阵內积的时候就需要用到这个转置:
1 2 3 4 5 6 |
# 矩阵內积 >>>np.dot(a.T, a) array([[ 80, 92, 104, 116], [ 92, 107, 122, 137], [104, 122, 140, 158], [116, 137, 158, 179]]) |
除此之外,还可以通过transpose()
方法指定轴对换的顺序:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>>import numpy as np >>>a = np.arange(12).reshape(2, 2, 3) >>>a array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]) >>>a.transpose((1, 0, 2)) # 交换了第0轴和第1轴 array([[[ 0, 1, 2], [ 6, 7, 8]], [[ 3, 4, 5], [ 9, 10, 11]]]) >>>a array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]) |
通过transpose()
方法,传入一个元组,顺序是(1, 0, 2)
改变了第0轴和第1轴,而第2轴的数据不变。转置以后的数组直接是对原数组的修改。
最后再介绍swapaxes()
方法,它接受一对轴编号:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>>import numpy as np >>>a = np.arange(12).reshape(2, 2, 3) >>>a array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]) >>>a.swapaxes(0, 1) # 交换第0轴和第1轴 array([[[ 0, 1, 2], [ 6, 7, 8]], [[ 3, 4, 5], [ 9, 10, 11]]]) >>>a array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]) |
可以看出swapaxes()
方法不直接改变原来的数组a,但是它也是源数据的视图,也就是说不会对数组进行复制。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
>>>b = a.swapaxes(0, 1) >>>b array([[[ 0, 1, 2], [ 6, 7, 8]], [[ 3, 4, 5], [ 9, 10, 11]]]) >>>b[0, 0, 0] = 1 >>>b array([[[ 1, 1, 2], [ 6, 7, 8]], [[ 3, 4, 5], [ 9, 10, 11]]]) >>>a array([[[ 1, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]) |
可以看到对数组b
的修改,直接影响了原来的数组a
。
总结
本文介绍了三种进行数组转置的方法。转置是对源数据视图的操作,除此之外要注意transpose()
方法和swapaxes()
方法的区别。