numpy 札记

  • 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])
原文地址:https://www.cnblogs.com/vin-yuan/p/5066922.html