Numpy是Numberical Python的简称,是用来进行高性能计算与分析的基础包,是Python中重要的扩充库。它支持高维度数组与矩阵运算,也针对数组运算提供了大量的数学函数库。Numpy运算效率极好,是大量机器学习框架的基础库。
使用Numpy,开发人员可以很方便地执行数组运算、逻辑运算、傅里叶变换和图形图像操作。Numpy数组地运算效率优于Python的标准List类型,而且在代码中使用Numpy可以省去很多繁琐的操作语句,代码更将简洁。
一般使用如下方式引入Numpy库:
import numpy as np
Numpy的强大功能在于底层的ndarray结构,该结构可以生成N维数组对象。
ndarray对象是一系列同类型数据的集合,下标索引从0开始,是一个用于存放同类型元素的多维数组。ndarray中的每个元素在内存中都具有相同大小的存储区域。
ndarray可以通过对数组建立索引或切片来访问数组内容,也可以使用ndarray的方法和属性来访问和修改ndarray内容。
ndarray中的相关属性如下:
在Numpy模块中,提供了ndarray()和array()两个函数,都可以用来建立一个ndarray。其中ndarray函数属于底层的方法,一般都是使用darray()函数进行创建,创建的语法格式如下:
numpy.array(object,dtype=None,copy=True,order=None,subox=False,ndmin=0)
参数介绍:
import numpy as np
a = np.array([1,2,3]) #创建一维数组并输出
print(a)
print(type(a))
a = np.array([[1,2],[3,4]]) #创建二维数组并输出
print(a)
print(a.shape)
a = np.array([1,2,3,4],ndmin=2) #创建数组并设置数组的最小维度为2
print(a)
a = np.array([1,2,3,4],dtype=np.complex128) #创建数组并设置其数组数据类型为complex128
print(a)
Numpy内置了24种数组标量类型,也支持Python的基本数组类型。
名称 | 描述 |
---|---|
bool_ | 布尔型,True或False |
int8 | 有符号字节类型,范围为-128~127 |
int16 | 有符号16位整数,范围为-32768~32767 |
int32 | 有符号32位整数 |
int64 | 有符号64位整数 |
unit8 | 无符号字节类型,范围为0~255 |
unit16 | 无符号16位整数,范围为0~65535 |
unit32 | 无符号32位整数 |
unit64 | 无符号64位整数 |
float_ | 64位浮点数,同float64 |
float16 | 16位浮点数 |
float32 | 32位浮点数 |
float64 | 64位(双精度)浮点数 |
complex_ | 128位复数,同complex128 |
complex64 | 64位复数 |
complex128 | 128位复数 |
对于每种数据类型,Numpy还提供了同名的类型函数,如float16()、int32()等,可以用来创建该类型的数据对象,也可以用来转换数据对象的数据类型。
类型函数的使用:
x=np.int32(2)
print('x为:',x)
print('x对象的data属性:',x.data)
print('x对象的size属性:',x.size)
print('x对象的维数:',x.ndim)
y=np.bool_(x)
print('转换为bool类型的x为:',y)
z=np.float16(y)
print('转换为folat16类型的y为:',z)
除了类型函数外,通常情况下一般建议使用Numpy种的dtype对象指定数据类型。
构建dtype对象的语法如下:
numpy.dtype(object,align,copy)
相关参数属性如下:
使用dtype对象设置数据类型:
x=np.int32(1)
y=np.array(x,dtype="bool_")
print('转换为bool类型的x为:',y)
z=np.array(y,dtype="float16")
print('转换为folat16类型的y为:',z)
有些数据类型有简写,例如int8,int16,int32,int64四种数据类型可以使用字符串’i1’,‘i2’,‘i4’,'i8’简写代替。
使用i4字符串代替int32类型:
dt=np.dtype('i4')
print(dt)
在数组建立之后,也可以使用Numpy中数组附带的astype()方法修改其数据类型。语法格式如下:
array.astype(dtype,order='K'.casting='unsafe',subok=True,copy=True)
使用astype()修改数据类型:
x=np.int32(1)
y1 = x.astype("float32")
print('转换为folat32类型的x为:',y1)
y2 = x.astype(np.float32)
print('转换为folat32类型的x为:',y2)
在上述语句中x.astype(float)和x.astype(np.float)运行结果相同。常见的Python对象与Numpy对象的对应表如下,其他数据类型没有与Python等效的对应表。
Python对象 | dtype对象 |
---|---|
int | numpy.int_ |
bool | numpy.bool_ |
float | numpy.folat_ |
complex | numpy.complex_ |
在Numpy数组中,常用的术语主要有两个。
(1)轴(Axis):每个线性数组称为一个轴,轴即数组的维度(Dimensions)。例如,将二维数组看作一维数组,此一维数组中每个元素又是一个一维数组,则每个一维数组是NumPy 中的一个轴。第一个轴相当于底层数组,第二个轴是底层数组中的数组。
(2)秩(Rank):秩描述 NumPy 数组的维数,即轴的数量。一维数组的秩为 1,二维数组的秩为 2,以此类推。
例如[0,1,2]是一维数组,只有一个轴,其秩为1,轴长度为3。[[1,2,3],[3,4,5]]是一个二维数组,数组的秩为2,具有两个轴,其中第一个轴(维度)的长度为2,第二个轴(维度)的长度为3。
在使用的时候可以声明 axis。如果axis=0,表示按第0轴方向操作,即对每列进行操作;如果 axis=1,表示按第1轴方向操作,即对每行进行操作。
使用axis参数进行轴向操作:
arr1=np.array([[1,2,3],[4,5,6]])
print(arr1)
print(arr1.sum(axis=0)) #进行垂直(列)方向的求和
print(arr1.sum(axis=1)) #进行行方向的求和
此外在Numpy中ndarray具有关于数组的相关基本属性,可以通过相关参数进行查看,常见属性如下:
参数 | 属性 |
---|---|
ndarray.ndim | 秩、轴的数量 |
ndarray.shape | 数组的形状 |
ndarray.size | 数组元素的总个数 |
ndarray.dtype | 数组元素类型 |
ndarray.itemsize | 每个元素的大小 |
ndarray.data | 实际数组元素 |
上述相关参数的使用:
arr2=np.array([[1,2,3],[4,5,6]])
print(arr2.ndim) #显示轴的数量
print(arr2.shape) #显示形状
arr2.shape=(3,2)
print(arr2) #调整形状
print(arr2.size) #显示元素总个数
print(arr2.dtype) #显示数组元素类型
print(arr2.itemsize) #显示每个元素大小
print(arr2.data) #显示实际数组元素
此外还可以使用reshape函数对数组进行变形重构,调整数组形状,其语法格式如下:
numpy.reshape(arr,newshape,order='C')
使用reshape调整数组形状:
arr3 = np.array([1,2,3,4,5,6,7,8])
print(arr3.ndim) #显示秩
arr4 = arr3.reshape(2,2,2)
print(arr4)
print(arr4.ndim) #显示秩