numpy的使用
numpy简介
numpy是Python中用来处理大量的维度数组与矩阵运算的库,也针对数组运算提供了大量的数学函数库.
numpy主要哦用于数组计算,包含:
- 一个强大的N维数组对象ndarry
- 广播功能函数
- 整合C/C++/Fortran代码的工具
- 线性代数、傅里叶变换、随机数生成等功能
numpy通常与SciPy(Scientific Python)和Matplotlib(绘图库)一起使用,这种组合广泛用于替代MATLAB.是一个强大的科学计算环境,有助于我们通过Python学习数据科学或者机器学习.
SciPy是一个开源的Python算法库和数学工具包.
SciPy包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算.
Matplotlib是Python编程语言机器数值数学扩展包numpy的可视化操作界面.它为利用通用的图形用户界面工具包,如Tkinter,wxPython,Qt或者GTK+想应用程序嵌入式绘图提供了应用程序接口(API).
numpy的Ndarray对象
numpy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引.
ndarray对象是用于存放同类元素的多维数组.
ndarray中的每个元素在内存中都有相同存储大小的区域.
ndarray内部由以下内容组成:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针;
- 数据类型或dtype:描述在数组中的固定大小值的个子;
- 一个表示数组形状(shape)的元组,表示各维度大小的元组;
- 一个跨度元祖(stride):其中的整数指的是为了前进道当前维度下一个元素需要"跨过"的字节数.
注释:跨度可以是复数,这样会使数组在内存中后向移动,切片中obj[::-1]或者obj[:,::-1]就是如此
注释:ndarray是一个对象,而array是一个方法.
ndarray的创建
创建一个ndarray对象只需要调用Array函数即可:
numpy.array(object, dtype=None,copy=True, order=None,subok=False, ndmin=0)
参数说明:
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
ndarray对象由计算机内存的连续一维部分组成,并结合索引模式,将每个元素映射到内存块中的一个位置.内存块以行顺序(C样式)或列顺序(FORTRAN或MATLAB风格,即前述的F样式)来保存元素.
numpy的数据类型
numpy支持的数据类型比Python内置的类型要多很多,基本上可以和C语言的数据类型对应上,其中部分类型对应为Python内置的类型.下表列举了常用的Numpy基本类型.
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True或False) |
int_ | 默认的整数类型(类似于C语言中的long,int32或int64) |
intc | 与C的int雷影一样,一般是int32或int64 |
intp | 用于索引的整数类型(类似于C的ssize_t,一般情况下仍然是int32或int64) |
int8 | 字节(-128 to127) |
int16 | 字节(-216 to 216-1) |
int32 | 同理 |
int64 | 同理 |
uint8 | 无符号整数(0 to 28) |
unit16(32,64) | 同理 |
float_ | float64类型的简写 |
float16 | 半精度浮点数,包括1个符号位,5个指数位,10个尾数位 |
float32 | 单精度浮点数,包括1个符号位,8个指数位,23个尾数位 |
float64 | 双精度浮点数,包括1个符号位,11个指数位,52个尾数位 |
complex_ | complex128的简写,即128位复数 |
complex64 | 复数,表示双32位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双64位浮点数(实数部分和虚数部分) |
numpy的数值类型实际上是dtype对象的实例,并对应唯一的字符,包括np.boo;_,np.int32,np.float32,等等
数据类型对象(dtype)
数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:
- 数据的类型(整数,浮点数或者Python对象)
- 数据的大小(例如,整数使用多少个字节存储)
- 数据的字节顺序(小端法或大端法)
- 在结构化类型的情况下,字段你的名称,每个字段的数据类型和每个字段所取的内存块的部分
- 如果数据类型是子数组,它的形状和数据类型
字节顺序是通过对数据类型预先设定"<“或”>“来决定的.”<“以为这小端法(最小值存储在最小的地址,即低位组放在最前面).”>"意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面).
dtype对象使用一下语法构造的:
numpy.dtype(object, align, copy)
- object:要转换为的数据类型对象
- align:如果为true,填充字段时期类似C的结构体
- copy:复制dtype对象,如果为false,则是对内置数据类型对象的引用
注释:numpy.dtype对象是用来规范numpy.array创建的数据的数据类型的,可以将多个字段的不同类型放在dtype类型中
numpy中每个内建类型都有一个唯一定义它的字符代码,如下:
字符 | 对应类型 |
---|---|
b | 布尔型 |
i | (有符号)整型 |
u | 无符号整型integer |
f | 浮点型 |
c | 复数浮点型 |
m | timedelta(时间间隔) |
M | datetime(日期时间) |
O | Python对象 |
S,a | byte-字符串 |
U | Unicode |
V | 原石数据(void) |
numpy的数组属性
numpy数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为1,二维数组的秩为2,以此类推.
在numpy中,每一个线性的数组称为一个轴(axis),也就是维度(dimensions).比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组.所以一维数组就是numpy中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组,而轴的数量—秩就是数组的维数.
很多时候可以声明axis,axis=0,表示沿着第0轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作.
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 | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性. |
ndarray.ndim
ndarray.ndim用于返回数组的维数,等于秩.
ndarray.shape()
ndarray.shape()表示数组的维度,返回一个元组,这个元组的航都就是维度的数目,即ndim属性(秩).比如,一个二维数组,其维度表示"行数"和"列数".
ndarray.shape也可以用来调整数组大小.
numpy也提供了reshape()函数来调整数组大小.
ndarray.reshape()方法
import numpy as np
a = np.arange(24)
print(a)
print(a.ndim)
b = a.reshape(2, 4, 3)
print(b)
print(b.ndim)
结果如下:
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]
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]]]
3
ndarray.itemsize
ndarray.itemsize以字节的形式返回数组中每一个元素的大小(占用内存的大小).
例如,一个元素类型为float64的数组itemsize属性值为8(8*8
),又如,一个元素类型为complex32的数组item属性为4(8*4
)
一个字节的长度为8,float64占用8个字节的长度,一个complex32占用4个字节的长度
ndarray.flags
属性 | 描述 |
---|---|
C_CONTIFUOUS© | 数据是在一个单一的C风格的连续段中 |
F_CONTIFUOUS(F) | 数据是在一个单一的Fortran风格的连续段中 |
OWNDATA(O) | 数组拥有它所使用的内存或从另一个对象中借用它 |
WRITEABLE(W) | 数据区域可以被写入,将该值设置为False,则数据为只读 |
ALIGEND(A) | 数据和所有元素都适当地对齐到硬件上 |
UPDATEIFCOPY(U) | 这个数组是其他数组的一个副本,当这个数组被释放时,原数组的内容将被更新 |
numpy创建数组
ndarray数组除了可以使用底层的ndarray构造器来创建外,也可以通过以下几种方式来创建.
numpy.empty()
numpy.empty()方法用来创建一个指定形状(shape),数据类型(dtype)且未初始化的数组:
numpy.empty(shape, dtype=float, order='C')
参数说明"
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序. |
使用numpy.empty()方法创建的数组元素为随机值,因为它们未初始化
numpy.zeros()
numpy.zeros()创建指定形状的数组,数组元素以0来填充
numpty.zeros(shape, dtype=float, order='C')
参数说明:
参数|描述
shape|数组形状
dtype|数据类型,可选
order|'C’用于C的航数组,或者’F’用于FORTRAN的列数组
numpy.ones()
numpy.ones()创建指定形状的数组,数组元素以1来填充:
numpy.ones(shape, dtype=None, order='C')
参数说明同numpy.zeros
numpy从已有的数组创建数组
numpy.asarray()
numpy.asarray()类似numpy.array(),但是numpy.asarray参数只有三个,比numpy.array少两个.
numpy.asarray(a, dtype=None, order=None)
参数说明:
参数 | 描述 |
---|---|
a | 任意形式的输入参数,可以是:列表,列表的元组,元组,元组的元组,元组的列表,多维数组 |
dtype | 数据类型,可选 |
order | 可选,有’C’和’F’两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序 |
numpy.frombuffer()
numpy.frombuffer()用于实现动态数组
numpy.frombuffer()接受buffer输入参数,以流的形式读入转化成ndarray对象
numpy.frombuffer(buffer,dtype=float, count=-1, offset=0)
注意:buffer是字符串的时候,Python3默认str是Unicode类型,所以要转成bytestring在原str前加上b
参数说明:
参数 | 描述 |
---|---|
buffer | 可以使任意对象,会以流的形式读入 |
dtype | 返回数组的数据类型 |
count | 读取的数据数量,默认为-1,读取所有数据 |
offset | 读取的起始位置,默认为0 |
numpy.fromiter()
numpy.fromiter()方法从可迭代对象中建立ndarray对象,返回一维数组
`numpy.fromiter(iterable, dtype, count=-1)
参数说明:
参数 | 描述 |
---|---|
iterable | 可迭代对象 |
dtype | 返回数组的数据类型 |
count | 读取的数据数量,默认为-1,读取所有数据 |
li = range(5)
print(li