一、numpy简介
Numpy是python语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组元素提供大量的数学函数库
1.作用
- Numpy是一个运算速度非常快的数学库,主要用于数组计算
2.包含
- 一个强大的N维数组对象ndarray
- 广播功能函数
- 整合c/c++/Fortran代码的工具
- 线性代数,傅里叶变换,随机数生成等功能
3.优势
- 对于同样的数值计算任务,使用numpy要比直接编写python代码便携的多
- numpy中的数组的存储效率和输入输出性能均远远优于python中等价的基本数据结构,且其能够提升性能是与数组中的元素成比例的
- numpy的大部分代码都是用c语言写的,其底层算法在设计时就有优异的性能,这使得numpy比纯python代码高效的多
4.应用
- numpy通常与scipy和matplotlib一起使用,这种组合广泛用于替代matlab,是一个强大的科学计算环境,有助于我们用过python学习数据科学或者机器学习。
5.scipy
- scipy是一个开源的python算法库和数学工具包,包含的模块有最优化,线性代数,积分,插值,特殊函数,楷书傅里叶变换,信号处理和图像处理,常微分方程求解和其他科学与工程中常用的计算
6.matplotlib
- matpoltlib是python编程语言及其数值数学拓展包Numpy的可视化操作界面,它为利用通用的图形用户界面工具包,如Tkinter,wxpython,qt或者gtk+向应用程序嵌入式绘图提供了应用程序接口(API)
7.安装
- 可使用pip install numpy 或者 conda install numpy
二、Ndarray对象简介
1.介绍
- numpy最重要的一个特点是其N维数组对象ndarray,它是一系列同类型数据的集合,以0下标为开始进行集合中元素的索引
- ndarray对象是用于存放同类型元素的多维数组
- ndarray中的每个元素在内存中都有相同存储大小的区域
2.组成
- 一个指向数据(内存或内存映射文件中的一块数据)的指针
- 数据类型或dtype,描述在数组中的固定大小值的格子
- 一个表示数组形状(shape)的元组,表示各维度大小的元组
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要“跨过”的字节数(空间大小)
三、数组的基本使用
1.numpy数据类型
- numpy支持的数据类型比python内置的类型要多很多,基本上可以和c语言的数据类型对应上,其中部分类型对应为python内置的类型
- numpy的数值类型实际上是dtype对象的实例,并对应唯一的字符,包括np.bool_,np.int32,np.float32等等
bool_ | 布尔型数据类型(True或者False) |
int_ | 默认的整数类型(类似于C语言中的long,int32或者int64) |
intc | 与C的int类型一样,一般是int32或者int64 |
intp | 用于索引的整数类型(类似于C的ssize_t,一般情况下仍然是int32或int64) |
int8 | 字节(-128to127) |
int16 | 整数(-32768to32767) |
int32 | 整数(-2147483648to2147483647) |
int64 | 整数(-9223372036854775808to9223372036854775807) |
uint8 | 无符号整数(0to255) |
uint16 | 无符号整数(0to65535) |
uint32 | 无符号整数(0to4294967295) |
uint64 | 无符号整数(0to18446744073709551615) |
float_ | float64类型的简写 |
float16 | 半精度浮点数,包括:1个符号位,5个指数位,10个尾数位 |
float32 | 单精度浮点数,包括:1个符号位,8个指数位,23个尾数位 |
float64 | 双精度浮点数,包括:1个符号位,11个指数位,52个尾数位 |
complex_ | complex128类型的缩写,即128位复数 |
complex64 | 复数,表示双32位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双64位浮点数(实数部分的虚数部分) |
- 每个内建类型都有一个唯一定义它的字符代码
b | 布尔型 |
i | (有符号)整型 |
u | 无符号整型integer |
f | 浮点型 |
c | 复数浮点型 |
m | timedelta(时间间隔) |
M | datetime(日期时间) |
o | (python)对象 |
S,a | (byte)字符串 |
U | Unicode |
V | 原始数据(void) |
数据类型对象(dtype)
数据类型对象是用来描述与数组对应的内存区域如何使用,这依赖如下几个方面:
- 数据的类型(整数,浮点数或者python对象)
- 数据的大小(例如,整数使用多少个字节存储)
- 数据的字节顺序(小端和大端法)【通过对数据类型预先设定“<”或“>”来决定的。“<”意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。“>”意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)】
- 在结构化类型的情况下,字段的名称,每个字段的数据类型和每个字段所取内存块的部分
- 如果数据类型是子数组,它的形状和数据类型
创建数据类型对象
原型:numpy.dtype(object, align, copy)
object | 要转换的数据类型对象 |
align | 如果为True,填充字段使其类似C的结构体 |
copy | 复制dtype对象,如果为False,则是对内置数据类型对象的引用 |
- 基本使用
import numpy as np
dt = np.dtype(np.int32)
print(dt)
print(type(dt))
# 输出结果
# int32
# <class 'numpy.dtype'>
import numpy as np
#int8,int16,int32,int64四种数据类型可以使用字符串'i1','i2','i4','i8'代替
dt = np.dtype('i4')
print(dt)
print(type(dt))
# 输出结果
# int32
# <class 'numpy.dtype'>
2.创建Ndarray数组对象
说明
- numpy默认Ndarray的所有元素类型是相同的,这一点与python中的list不同,如果传进来的列表中包含不同的类型,则统一为同一类型,优先级为:str>float>int。
array()函数
- 原型:numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
- 作用:创建Ndarray()数组对象
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度 |
- 一维数组
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr)
print(type(arr))
# 输出
# [1 2 3 4 5]
# <class 'numpy.ndarray'>
- 元素类型要相同
import numpy as np
arr = np.array([1,2,3.5,4])
print(arr)
print(type(arr))
# 输出
#[1. 2. 3.5 4. ]
#<class 'numpy.ndarray'>
- 多维数组
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print(type(arr))
# 输入
# [[1 2 3]
# [4 5 6]]
# <class 'numpy.ndarray'>
- 规定最小维度
import numpy as np
arr = np.array([1,2,3,4,5], ndmin=2)
print(arr)
print(type(arr))
# 输出
# [[1 2 3 4 5]]
# <class 'numpy.ndarray'>
- dtype参数
import numpy as np
student = np.dtype([("name", "S20"),("age", "i1"),("marks", "f4")])
arr = np.array([("zs", 20, 100), ("ls", 18, 100)], student)
print(arr)
print(type(arr))
# 输出
# [(b'zs', 20, 100.) (b'ls', 18, 100.)]
# <class 'numpy.ndarray'>
asarray()函数
- 原型:numpy.asarray(a, dtype = None, order = None)
- 作用:类似numpy.array, 但numpy.asarray只有三个参数,比numpy.array少两个
a | 任意形式的输入参数,可以是列表,列表的元组,元组,元组的元组,元组的列表,多维数组 |
dtype | 数据类型,可选 |
order | 可选,有“C”和“F”两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序 |
import numpy as np
arr = np.asarray([1,2,3,4,5])
print(arr)
print(type(arr))
# 输出
# [1 2 3 4 5]
# <class 'numpy.ndarray'>
arr = np.asarray((1,2,3,4,5))
print(arr)
# 输出
# [1 2 3 4 5]
arr = np.asarray([(1,2,3),(4,5,6)])
print(arr)
# 输出
# [[1 2 3]
# [4 5 6]]
arr = np.asarray([1,2,3,4,5], dtype = "f")
print(arr)
#[1. 2. 3. 4. 5.]
empty()函数
- 原型:numpy.empty(shape, dtype = float, order = "C")
- 作用:创建一个指定形状(shape),数据类型(dtype)且未初始化的数组
shape | 数组形状 |
dtype | 数剧类型,可选 |
order | 有”C“和”F“两种选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序 |
import numpy as np
arr = np.empty([3,2], dtype="i")
print(arr)
# 输出
# 初始化,数值的值每次运行都会变化
#[[1877552304 444]
#[ 0 0]
#[ 1 0]]
zeros()函数
- 原型:numpy.zeros(shape, dtype=float, order="C")
- 作用:创建指定大小的数组,数组元素以0来填充
shape | 数组的形状 |
dtype | 数剧的类型,可选 |
order | “C”用于行数组,或者“F”用于列数组 |
import numpy as np
arr = np.zeros(5)
print(arr)
#输出
#[0. 0. 0. 0. 0.]
arr = np.zeros([3,2])
print(arr)
#输出
#[[0. 0.]
# [0. 0.]
# [0. 0.]]
arr = np.zeros([3,2], dtype="i")
print(arr)
#输出
#[[0 0]
# [0 0]
# [0 0]]
arr = np.zeros([3,2], dtype=[("x", "i"), ("y", "f")])
print(arr)
#输出
#[[(0, 0.) (0, 0.)]
# [(0, 0.) (0, 0.)]
# [(0, 0.) (0, 0.)]]
ones()函数
- 原型:numpy.ones(shape, dtype=None, order="C")
- 作用:创建指定形状的数组,数组元素以1来填充
shape | 数组形状 |
dtype | 数剧类型,可选 |
order | C用于C的行数组,或者F用于FORTRAN的列数组 |
import numpy as np
arr = np.ones(5)
print(arr)
#输出
#[1. 1. 1. 1. 1.]
arr = np.ones([3,2])
print(arr)
#输出
#[[1. 1.]
# [1. 1.]
# [1. 1.]]
arr = np.ones([3,2], dtype="i")
print(arr)
#输出
#[[1 1]
# [1 1]
# [1 1]]
arr = np.ones([3,2], dtype=[("x","i"),("y","f")])
print(arr)
#输出
#[[(1, 1.) (1, 1.)]
# [(1, 1.) (1, 1.)]
# [(1, 1.) (1, 1.)]]
full()函数
- 原型:numpy.full(shape, fill_value, dtype=None, order="C")
- 作用:创建指定形状的数组,数组元素以fill_value来填充
shape | 数组形状 |
fill_value | 填充的数据 |
dtype | 数剧类型,可选 |
order | C用于C的行数组,或者F用于FORTRAN的列数组 |
import numpy as np
arr = np.full([3,2],fill_value=1024,dtype="i4")
print(arr)
#输出
#[[1024 1024]
# [1024 1024]
# [1024 1024]]
eye()函数
- 原型:numpy.eye(N,M=None,k=0, dtype=float, order="C")
- 作用:对角线为1其他位置为0
N | 行数量 |
M | 列数量 |
dtype | 数剧类型,可选 |
order | C用于C的行数组,或者F用于FORTRAN的列数组 |
import numpy as np
arr = np.eye(3,dtype="i4")
print(arr)
# 输出
# [[1 0 0]
# [0 1 0]
# [0 0 1]]
arange()函数
- 原型:numpy.arange(start, stop, step, dtype)
- 作用:创建数值范围并返回ndarray对象,根据start与stop指定的范围以及step设定的步长,生成一个ndarray
start | 起始值,默认为0 |
stop | 终止值(不包含) |
step | 步长,默认为1 |
dtype | 返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型 |
import numpy as np
arr = np.arange(1, 11, 2, dtype="i4")
print(arr)
# 输入
# [1 3 5 7 9]
frombuffer()函数
- 原型:numpy.frombuffer(buffer, dtype=float, count=-1,offset=0)
- 作用:用于实现动态数组,接收buffer输入参数,以流的形式读入转化成ndarray对象
- 注意:buffer是字符串的时候,python3默认str是unicode类型,所以要转成bytestring再原str前面加上b
buffer | 可以是任意对象,会以流的形式读入 |
dtype | 返回数组的数据类型,可选 |
count | 读取的数据数量,默认为-1, 读取所有数据 |
offset | 读取的起始位置,默认为0 |
import numpy as np
str_ = b"hello world"
arr = np.frombuffer(str_, dtype="S1", count=5, offset=2)
print(arr)
# 输出
# [b'l' b'l' b'o' b' ' b'w']
fromiter()函数
- 原型:numpy.fromiter(iterable, dtype, count=-1)
- 作用:从可迭代的对象中建立ndarray对象,返回一维数组
iterable | 可迭代对象 |
dtype | 返回数组的数据类型,可选 |
count | 读取的数据数量,默认为-1,读取所有数据 |
import numpy as np
x = [1,2,3,4,5]
z = iter(x)
print(z)
arr = np.fromiter(z, dtype="i4", count=4)
print(arr)
# 输出
# <list_iterator object at 0x000002D77FEC9080>
# [1 2 3 4]
linspace()函数
- 原型:numpy.linspace(start, stop, num=50, endpoint=true, retstep=False,dtype=None)
- 作用:创建一个一维数组,数值是一个等差数列构成的
start | 序列的起始值 |
stop | 序列的终止值,如果endpoint为true,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为true时,数列中包含stop值,反之不包含,默认为true |
retstep | 如果为true时,生成的数值中会显示间距,反之不显示 |
dtype | ndarray的数据类型 |
import numpy as np
arr = np.linspace(1,10,3,dtype="i4")
print(arr)
# 输出
# [ 1 5 10]
logspace()函数
- 原型:numpy.logspace(start, stop, num=50, endpoint=true,base=10.0,dtype=None)
- 作用:创建一个等比数列
start | 序列的起始值为:base**start |
stop | 序列的终止值为:base**stop。如果endpoint为true,该值包含于数列中 |
num | 要生成的等步长的样本数量,默认为50 |
endpoint | 该值为true是,数列中包含stop值,反之不包含,默认为True |
base | 对数log的底数, 默认是10 |
dtype | ndarray的数据类型 |
import numpy as np
arr = np.logspace(1,10,10,dtype="i4",base=2)
print(arr)
# 输出
# [ 2 4 8 16 32 64 128 256 512 1024]
random.rand()
- 原型:numpy.random.rand(d0,d1,d2,.....,dn)
- 作用:生成[0,1)之间的随机数
- 生成0,1之间的随机数
import numpy as np
arr = np.random.rand()
print(arr)
# 0.9185363156761576
- 生成一个有3个元素的一维数组,元素值在0到1之间
import numpy as np
arr = np.random.rand(3)
print(arr)
# [0.19540265 0.05196615 0.19760922]
- 生成一个二维数组,元素值在0到1之间
import numpy as np
arr = np.random.rand(3,2)
print(arr)
# [[0.73464143 0.93573281]
# [0.60166518 0.8168656 ]
# [0.46130071 0.62225312]]
random.random()
- 原型:numpy.random.random(size=None)
- 作用:生成[0,1)之间的随机数
size | 元素个数 |
- 生成0到1之间的随机数
import numpy as np
arr = np.random.random()
print(arr)
# 0.038177576025269944
- 生成一个有3个元素的一维数组,元素值在0到1之间
import numpy as np
arr = np.random.random(3)
print(arr)
# [0.89415182 0.41692305 0.05000384]
random.randint()
- 原型:randint(low,high=None,dtype="i")
- 作用:生成随机数
low | 包含的下限 |
high | 不包含的上限 |
size | 元素个数 |
dtype | 元素类型 |
import numpy as np
arr = np.random.randint(0,10,3)
print(arr)
# [1 3 8]
random.randn()
- 原型:numpy.random.randn(d0,d1,d2,,,dn)
- 作用:返回一个或一组样本,具有标准正态分布
- 标准正态分布:又称为u分布,是以0为均值,以1为标准差的正态分布,记为N(0,1)
import numpy as np
arr = np.random.randn()
print(arr)
# -0.8448995797110743
import numpy as np
arr = np.random.randn(2,4)
print(arr)
#[[ 1.013186 -0.16393337 1.04776331 0.04324756]
# [-1.21219629 -0.0699094 -0.04158484 -0.64842859]]
import numpy as np
arr = np.random.randn(4,3,2)
print(arr)
#[[[ 1.25923402 -0.50526673]
# [-0.48671163 -0.56756381]
# [-0.51491704 0.91395557]]
# [[-0.45384604 0.21068678]
# [ 2.17285565 -2.27612329]
# [-0.65976791 -0.75429788]]
# [[-0.79123359 -1.171368 ]
# [ 0.43132159 0.8026211 ]
# [ 0.05512591 0.96871725]]
# [[-0.22467091 -0.06629686]
# [-0.4785244 -0.48309375]
# [-1.03609105 0.21415391]]]
random.normal()
- 原型:numpy.random.normal(loc=0.0, scale=1.0, size=None)
- 作用:生成高斯分布的概率密度随机数
loc | 浮点型,此概率分布的均值(对应着整个分布的中心) |
scale | 浮点型,此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越高瘦) |
size | 输出的shape,默认为None,只输出一个值 |
import numpy as np
arr = np.random.normal(loc=1, scale=2,size=5)
print(arr)
# [ 4.00300317 -3.78664425 0.42317672 -0.17428225 0.81371244]
3.numpy数组与python中列表的对比
- 效率对比
import random
import time
import numpy as np
li=[]
for i in range(1000000):
li.append(i)
)
# python列表
t1 = time.time()
ret = sum(li)
t2 = time.time()
print(f"列表耗时:{t2-t1}")
# numpy数组
n = np.array(li)
t1 = time.time()
ret = np.sum(n)
t2 = time.time()
print(f"数组耗时:{t2-t1}")
# 列表耗时:0.021838665008544922
# 数组耗时:0.0010006427764892578
4.Ndarray数组属性
- Ndarray数组的维数称为秩(rank), 一维数组的秩为1,二维数组的秩为2,以此类推。在NumPy中,每个线性的数组称为一个轴(axis),也就是维度(dimensions)。比如说,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组。所以一维数组就是Numpy中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量--秩,就是数值的维数。很多时候可以声明axis。axis=0,表示沿着第0轴进行操作,即对每一列进行操作;axis=1,表示沿着第一轴进行操作,即对每一行进行操作。
ndim | 秩,即轴的数量或维度的数量 |
shape | 数组的维度,对于矩阵,n行m列 |
size | 数组元素的总个数,相当于.shape中的n*m的值 |
dtype | ndarray对象的元素类型 |
itemsize | ndarray对象中每个元素的大小,以字节为单位 |
flags | ndarray对象的内存信息 |
real | ndarray对象的实部 |
imag | ndarray对象的虚部 |
data | 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性 |
ndim
import numpy as np
arr = np.arange(24)
print(arr)
print(arr.ndim)
# 调整维数,li现在拥有3个维度
li = arr.reshape(2,3,4)
print(li)
print(li.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
"""
shape
- 表示数组的维度,返回一个元组,这个元组的长度就是维度的数目,即ndim属性(秩)。比如,一个二维数组,其维度表示行数和列数
- 得到维度
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print(arr.shape)
"""
[[1 2 3]
[4 5 6]]
(2, 3)
"""
- 调整数组大小
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
arr.shape = (3,2)
print(arr)
print(arr.shape)
"""
[[1 2]
[3 4]
[5 6]]
(3, 2)
"""
size
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print(arr.size)
"""
[[1 2 3]
[4 5 6]]
6
"""
dtype
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
print(arr)
print(arr.dtype)
"""
[[1 2 3]
[4 5 6]]
int32
"""
itemsize
以字节的形式返回数组中每个元素的大小
import numpy as np
arr = np.array([1,2,3,4,5,6], dtype="i4")
print(arr)
print(arr.itemsize)
"""
[1 2 3 4 5 6]
4
"""
flags
返回ndarray对象的内存信息
C_CONTIGUOUS(C) | 数据是在一个单一的C风格的连续段中 |
F_CONTIGUOUS(F) | 数据是在一个单一的Fortran风格的连续段中 |
OWNDATA(O) | 数组拥有它所使用的内存或者从另一个对象中借用它 |
WRITEABLE(W) | 数据区域可以被写入,将该值设置为False,则数据为只读 |
ALIGNED(A) | 数据和所有元素都适当的对齐到硬件上 |
UPDATEIFCOPY(U) | 这个数组是其他数组的一个副本,当这个数组被释放时,原数组的内容将被更新 |
import numpy as np
arr = np.array([1,2,3,4,5])
print(arr)
print(arr.flags)
"""
[1 2 3 4 5]
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
WRITEBACKIFCOPY : False
UPDATEIFCOPY : False
"""