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; ]]