1)数组转置和轴对换
转置(transpose)是重塑的一种特殊形式,它返回的是源数据的视图(不会进行任何复制操作),不仅有transpose方法,还有一个特殊的T属性
import numpy as np
arr=np.arange(15)
arr
arr=arr.reshape((3,5))
arr
二维数组转置后,原来的行变成列,原来arr是3行5列的数组,现在变成了5行3列,转置只是返回的是视图,不改变原来的数组
arr.T
arr.transpose()
arr.T.shape
arr.transpose().shape
对于高维数组,transpose需要一个轴编号组成的元组才能对这些轴进行转置,那轴编号是什么呢?按照定义,轴编号是数组shape的索引编号。对于二维数组Axis 0是第一维(也就是行rows),Axis 1是第二维(也就是列columns),对于高维数组行和列没那么直观,需要从数组shape的索引来考虑。如果操作 .sum(axis=n),则第n维就会折叠和删除,而新矩阵的值等于对应折叠列求和。
arr=np.arange(24).reshape((2,3,4))
arr
现在arr的shape为(2,3,4),Axis 0对应2,Axis 1对应3,Axis 2对应4
arr.shape
把arr变为shape为(3,2,4)的数组,交换Axis0和Axis1的位置即可
a=arr.transpose((1,0,2))
a
a.shape
把arr变shape为(4,3,2)的数组,则重新编排下Axis的顺序即可
b=arr.transpose((2,1,0))
b
b.shape
有时候我们仅仅想交换两个Axis而已,不想写出全部的Axis,那么就使用swapaxes方法,函数接口为swapaxes(axis1,axis2),
例如把arr数组变成shape为(3,2,4),效果和arr.transpose((1,0,2))
一样
arr.swapaxes(0,1)
c=arr.swapaxes(1,0)
c
c.shape
现在想把c数组变成shape成(3,2),并且值是最后一维是求和
d=c.sum(axis=2)
d
d.shape
2)tensorflow也有对应的操作,分别是tf.shape(input,name=None,out_type=tf.int32)
和tf.transpose(a,perm=None,name='tranpose',conjugate=False)
import tensorflow as tf
sess=tf.Session()
t=tf.constant(np.arange(24).reshape((2,3,4)))
sess.run(t)
sess.run(tf.shape(t))
把t变成shape为(4,3,2)的tensor
t1=tf.transpose(t,perm=[2,1,0])
sess.run(t1)
sess.run(tf.shape(t1))
3)time_major和batch_major的区别
想象你有如下的数据,shape为(batch_size,features),batch_size=100,features=4,其中每行为一个训练数据的输入,每列是不同的数据特征。
arr=np.arange(200).reshape((50,4))
arr
arr.shape
arr的转置矩阵如下,也就是矩阵变成了(features,batch_size)
a=arr.transpose((1,0))
a
a.shape
对于RNN的输入张量通常是3维数组以上,如果输入的是(batch_size,sequence_num,features),则叫做batch major,因为Axis 0是batch_size;如果输入的是(sequence_num,batch_size,features),则叫做time major,因为Axis 0是sequence_num。特征features总是最后的一维。到底是batch major还是time major取决于函数的API,按照API格式输入即可
《python for data analysis》
What's the difference between data time major and batch major?
how is axis indexed in numpy's array?
《tensorflow官方文档》