-
transpose
在处理caffe读入的图片数据时,需要将原始图片的数据
H*W*3(height*width*RGB) 转换为 3*H*W(RGB*heigth*width)
需要用到numpy的transpose功能:设想图片尺寸2x2,RGB模式 则数组规模为2x2x3
>>>import numpy as np >>> x = np.arange(12).reshape(2,2,3) >>> x array([[[ 0, 1, 2], [ 3, 4, 5]], [[ 6, 7, 8], [ 9, 10, 11]]]) >>> x_ = np.transpose(x,(2,0,1)) >>> x_ array([[[ 0, 3], [ 6, 9]], [[ 1, 4], [ 7, 10]], [[ 2, 5], [ 8, 11]]]) >>>
transpose的实现原理其实很简单,只要保存一个view即可,例如原索引是i,j,k,按照“(2,0,1)” transpose后,索引便成为k,i,j,即Ai,j,k = ATk,i,j ,可以用上面的例子试验。
-
多维数组指定axies上元素顺序的调换(例如RGB->BGR):
还有一个问题,在caffe中根据convention使用BGR的通道模式,所以对如上x_做0轴上的变换
>>> x_.shape (3, 2, 2) >>> x_[(2,1,0),:,:] array([[[ 2, 5], [ 8, 11]], [[ 1, 4], [ 7, 10]], [[ 0, 3], [ 6, 9]]]) >>>
调换选定轴上元素的位置其实很方便,在指定轴位置放置指示顺序的tuple即可,其他轴保持(使用":")。
例如将上面的2x2矩阵上下两行对调
>>> x_ array([[[ 0, 3], [ 6, 9]], [[ 1, 4], [ 7, 10]], [[ 2, 5], [ 8, 11]]]) >>> x_.shape (3, 2, 2) >>> x_[:,(1,0),:] array([[[ 6, 9], [ 0, 3]], [[ 7, 10], [ 1, 4]], [[ 8, 11], [ 2, 5]]]) >>>
-
两个元素个数相同但维数不同的数组赋值
例如'x_flat'是维数为(12,)的行向量,现在想将上面的2x2x3数组'x_'复制给'x_flat'而不改变'x_flat'的内存空间,可如下:
>>> x_flat = np.arange(12) >>> x_flat.shape (12,) >>> x_flat array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> x_ array([[[ 0, 3], [ 6, 9]], [[ 1, 4], [ 7, 10]], [[ 2, 5], [ 8, 11]]]) >>> x_flat.flat = x_.flat >>> x_flat array([ 0, 3, 6, 9, 1, 4, 7, 10, 2, 5, 8, 11])