Numpy使用要点

深度学习的处理的数据主要是多维数组数据,使用Numpy组件可以灵活的处理大量多维数据。以下为在学习深度学习中遇到的Numpy问题做一简要总结。
一、NumPy Ndarray 对象
NumPy 重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。创建一个 ndarray对象,需调用 NumPy 的 array 函数即可:

numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

参数说明:
object 数组或嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)
subok 默认返回一个与基类类型一致的数组
ndmin 指定生成数组的最小维度
ndarray 对象是用于存放同类型元素的多维数组。
实例 1 建立一维数组

import numpy as np 
a = np.array([1,2,3])  
print (a)

实例 2 建立二维数组

import numpy as np 
a = np.array([[1,  2],  [3,  4]])  
print (a)

实例3 建立三维数组

import numpy as np 
a = np.array([[[1,  2],  [3,  4]],
             [[5,6],[7, 8]]]
print (a)

实例4 使用dtype参数

import numpy as np 
a = np.array([1,  2,  3], dtype = complex)  
print (a)

二、Numpy数据类型
bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64)
int8 字节(-128 to 127)
int16 整数(-32768 to 32767)
int32 整数(-2147483648 to 2147483647)
int64 整数(-9223372036854775808 to 9223372036854775807)
uint8 无符号整数(0 to 255)
uint16 无符号整数(0 to 65535)
uint32 无符号整数(0 to 4294967295)
uint64 无符号整数(0 to 18446744073709551615)
float_ float64 类型的简写
float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位
float32 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位
float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位
complex_ complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)
numpy 的数值类型实际上是 dtype 对象的实例,并对应唯一的字符,包括 np.bool_,np.int32,np.float32,等等。
实例
接下来我们可以通过实例来理解。

实例 1 使用标题类型

import numpy as np
dt = np.dtype(np.int32)
print(dt)

三、NumPy 数组属性
在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度dimensions)。比如,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
NumPy 的数组中比较重要 ndarray 对象属性有:
ndarray.ndim 秩,即轴的数量或维度的数量
ndarray.shape 数组的维度,对于矩阵,n 行 m 列
ndarray.size 数组元素的总个数,相当于 .shape 中 n*m 的值
ndarray.dtype ndarray 对象的元素类型
ndarray.itemsize ndarray 对象中每个元素的大小,以字节为单位
ndarray.flags ndarray 对象的内存信息
ndarray.real ndarray元素的实部
ndarray.imag ndarray 元素的虚部
ndarray.data 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
实例1

import numpy as np 
     a = np.arange(24)  
    print (a.ndim)             # a 现只有一个维度
    #调整数据维度大小
    b = a.reshape(2,4,3)   # b 现在拥有三个维度
    print (b.ndim)

ndarray.shape 也可以用于调整数组大小。

实例2 shape属性显示维度信息

import numpy as np  
 a = np.array([[1,2,3],[4,5,6]])  
print (a.shape)    #结果是(2, 3)

四、axis(轴)操作
1.多维数组内的数据相加。
实例1 按axis=0方向相加

import numpy as np
b=np.arange(24).reshape(2,3,4)   #生成(2,3,4)三维数组
print(b)    #显示三维数组内容
b.sum(axis=0)

运行的结果为:

[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
array([[12, 14, 16, 18],
       [20, 22, 24, 26],
       [28, 30, 32, 34]])

分析:按照axis=0方向相加,即b[0][j][k]+b[1][j][k], j=0,1,2 ; k=0,1,2,3 ; 展开为:

[[ b[0][0][0]+b[1][0][0]=0+12=12; 
    b[0][0][1]+b[1][0][1]=1+13=14;
    b[0][0][2]+b[1][0][2]=2+14=16;
    b[0][0][3]+b[1][0][3]=3+15=18; ],
    [ b[0][1][0]+b[1][1][0]=4+16=20;
    b[0][1][1]+b[1][1][0]=5+17=22;
    b[0][1][2]+b[1][1][2]=6+18=24;
    b[0][1][3]+b[1][1][3]=7+19=26; ],
    [ b[0][2][0]+b[1][2][0]=8+20=28;
    b[0][2][1]+b[1][2][1]=9+21=30;
    b[0][2][2]+b[1][2][2]=10+22=32;
    b[0][2][3]+b[1][2][3]=11+23=34; ]]

数组元素相加后,数组降为二维数组
实例2 axis=1方向相加

import numpy as np
   b=np.arange(24).reshape(2,3,4)
   print(b)
   b.sum(axis=1)

运行结果为:

[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]
 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]
array([[12, 15, 18, 21],
       [48, 51, 54, 57]])

分析:按照axis=1方向相加,即b[i] [0][k]+b[i] [1][k]+b[i] [2][k], i=0,1 ; k=0,1,2,3 ; 展开为:

[[ b[0][0][0]+b[0][1][0]+b[0][2][0]=0+4+8=12; 
    b[0][0][1]+b[0][1][1]+b[0][2][1]=1+5+9=15;
    b[0][0][2]+b[0][1][2]+b[0][2][2]=2+6+10=18;
    b[0][0][3]+b[0][1][3]+b[0][2][3]=3+7+11=21;],
    [ b[1][0][0]+b[1][1][0]+b[1][2][0]=12+16+20=48;
    b[1][0][1]+b[1][1][1]+b[1][2][1]=13+17+21=51;
    b[1][0][2]+b[1][1][2]+b[1][2][2]=14+18+22=54;
    b[1][0][3]+b[1][1][3]+b[1][2][3]=15+19+23=57 ]]

实例3 按axis=2相加

import numpy as np
b=np.arange(24).reshape(2,3,4)
print(b)
b.sum(axis=2)

运行结果为:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
array([[ 6, 22, 38],
[54, 70, 86]])
分析:按照axis=2方向相加,即b[i][j][0]+b [i] [j] [1] +b[i] [j] [2]+b[i] [j][3], i=0,1 ; j=0,1,2 ; 展开为:

[[  b[0][0][0]+b[0][0][1]+b[0][0][2]+b[0] [0][3]=0+1+2+3=6;
    b[0][1][0]+b[0][1][1]+b[0][1][2]+b[0] [1][3]=4+5+6+7=22;
    b[0][2][0]+b[0][2][1]+b[0][2][2]+b[0] [0][2]=8+9+10+11=38; ],
    [ b[1][0][0]+b[1][0][1]+b[1][0][2]+b[1] [0][3]=12+13+14+15=54;
    b[1][1][0]+b[1][1][1]+b[1][1][2]+b[1] [1][3]=16+17+18+19=70;
    b[1][2][0]+b[1][2][1]+b[1][2][2]+b[1] [2][3]=20+21+22+23=86; ]]