文章目录
前言
Numpy官网函数查询
NumPy是Python中用于科学计算的一个基础包,它提供高效的N维数组操作和数学函数库。
下载Numpy包
pip install numpy
pip install numpy -i https://pypi.tuna.tsinghua.edu.cn/simple/
上面是使用pip从官方下载numpy包
下面是使用pip从清华源下载numpy包
点击了解更多pip命令行使用
导入Numpy包
import numpy as np //导入numpy包,令其名称为np
一、创建Numpy数组
在numpy中数组即为ndarray对象,全称numpy multidimensional array 即numpy多维数组
在numpy中的类型是numpy.ndarray
常使用numpy.array()创建数组
1.创建特殊ndarray
创建全为0的数组
numpy.zeros()
import numpy as np
a=np.zeros([5]) #一维可以简写成np.zeros(5)来创建
b=np.zeros([8,2])
c=np.zeros([3,4,5])
print(a)
print(b)
print(c)
创建全为一的数组
使用np.ones(),与zeros()相同操作
numpy.eye()
用法:
numpy.eye(N,M,K,dtype,order)
作用:
创建一个对角线上为1其余为0的数组
参数:
N输出的行数
M输出的列数 默认为none
K对角线的偏移量 默认为0,创建的数组即位单位数组
dtype该数组的值的类型 默认为float
order以什么(C,F)形式存储在内存中 默认为c语言形式
返回值:
返回一个(N,M)的对角线上是1其余是0的数组。
示例:
import numpy as np
a=np.eye(3)
b=np.eye(3,3,0) #生成3*3矩阵,主对角线为1,其余为0
c=np.eye(3,3,1) #生成3*3矩阵,主对角线向右偏移一位开始为1,其余为0
d=np.eye(3,4,0) #生成3*4矩阵,从首行首位开始对角线为1,其余为0
print(a)
print("\n")
print(b)
print("\n")
print(c)
print("\n")
print(d)
2.转化创建ndarray
import numpy as np
a=[1,2,3] #创建一个列表a
b=(1,2,3) #创建一个元组b
c={1,2,3} #创建一个集合c
arr1=np.array(a)
arr2=np.array(b)
arr3=np.array(c) #全部转化为数组
#打印转化前的类型和转化后的类型
print(type(a))
print(arr1)
print(type(arr1))
print('\n')
print(type(b))
print(arr2)
print(type(arr2))
print('\n')
print(type(c))
print(arr3)
print(type(arr3))
print('\n')
注意第三个转化中,集合转化为数组,会将整个集合作为数组的第一个元素;
类型依旧为<class ‘numpy.ndarray’>;
数组在输出一个元素时会直接输出,不会加[],因为将它整个集合视作了ndarray的一个元素;
那假如我们需要将集合中的元素作为一个个单独的int型的ndarray,一般会将其转化为list类型,然后再转成ndarray.
转载参考:如何将python集合转换为numpy数组? | 码农家园 (codenong.com)
注意:可以利用集合中元素的唯一性,将数据转化为集合形式,去除重复的数据。
3.创建随机数组
在numpy中创建随机数组的方式有两种,一种是使用random库直接创建,另一种是使用Generator生成器创建
1.使用numpy.random库直接创建
randint()
用法:
numpy.random.randint(low,hegh,size)
作用:
randint()会随机low到high的整数,左闭右开。
参数:
low随机数能取的最小的整数
high随机数能取的最大数的上限不能大于等于
size数组大小
seed()
用法:
numpy.random.seed(seed)
作用:
设置随机数种子
参数:
seed随机数种子
示例:
2.使用generator创建
用该方法生成随机数,设置随机数的方式不一样。
default_rng()
用法:
numpy.random.default_rng(seed)
作用:
设置随机数种子便于复现结果
参数:
seed 设置的种子
rng random number genertors(随机数生成器)
示例:
该函数会返回一个名为Generator(生成器)的对象。
该生成器对象可以调用random等函数,并且生成的随机数在固定种子下是固定的,即使不同时间不同设备也可以复现相同的数据
random()
用法:
generator.random(size) #或者使用np.random.random(size)一样效果
作用:
random()函数的作用是随机0-1的浮点数
参数:
size是数组大小
示例:
import numpy as np
x=np.random.default_rng(200) #固定了生成器种子为200,便于复现相同结果
z=x.random([3,5])
y=x.random(10)
print(z)
print("\n")
print(y)
在后续学习中会经常碰到axis这个参数,在此详细叙述一番
axis轴,复数形式axes。
numpy中的函数,axis该参数常常用来表示沿着哪个轴的方向。
通过此图不难发现,增加数组维度,原始维度的方向axis+1,新增维度为axis=0。
一维数组中按axis=0的方向切割就会切割出一些列“点”。
二维数组中按axis=0的方向切割就会切割出一系列的“行”。
三维数组中按axis=0的方向切割就会切割出一系列的面对我们的“面”。
numpy中有三个转换轴顺序的函数:
moveaxis()
用法:
numpy.moveaxis(a,source,destiantion)
作用:
会将source轴索引和destiantion轴索引的两条轴交换位置,然后按原先顺序往前或往后补
参数:
a 需要变换轴的数组
source 源轴索引
destiantion 目标轴索引
返回值:
返回轴变换后的数组
示例:
import numpy as np
x = np.zeros((3, 4, 5))
print(np.moveaxis(x, 0,-1).shape)
#source=0是值为3的轴,destaintion=-1是值为5的轴,将3往后移到5的位置,4,5按序往前移
print(np.moveaxis(x,1,-1).shape)
#source=1是值为4的轴,destaintion=-1是值为5的轴,将4往后移到5的位置,5按序往前移
print(np.moveaxis(x,-1,-3).shape)
#source=-1是值为5的轴,destaintion=-3是值为3的轴,将5往前移到3的位置,3,4按序往后移
注意:
如果选取了[-n,n)左闭右开区间以外的值作为索引参数会报以下错误
rollaxis()
用法:
numpy.rollaxis(a,axis,start)
作用:
将已有的轴变换位置,插入到两轴之间,后一个参数是具体那两个轴之间,它从开始的轴前开始排了一个轴之间的序列
参数:
a要变换轴的数组
axis选择要滚动插入的轴(axis轴参数就是从0至n索引)
start插入的位置
返回值:
变换插入轴后数组
示例:
import numpy as np
a = np.ones((3,4,5))
print(np.rollaxis(a,0,2).shape)
#axis=0是值为3的轴,start=2根据上图可知是在值为4,5轴之间
print(np.rollaxis(a,-1,-3).shape)
#axis=-1是值为5的轴,start=-3根据上图可知是在值为3的前面
print(np.rollaxis(a,0,3).shape)
#axis=0是值为3的轴,start=3根据上图可知是在值为5的后面
注意:
如果n为原数组维度,start参数在[-n,n]之外则会引发下类报错:
swapaxes()
用法:
numpy.swapaxes(a,axis1,axis2)
作用:
交换两个轴位置
参数:
a要进行变换的数组
axis1交换的轴1
axis2交换的轴2
返回值:
返回交换轴后的数组
示例:
import numpy as np
x = np.zeros((3, 4, 5))
print(np.swapaxes(x, 1,-3).shape)
#axis1=1是值为4的轴,axis2=-3是值为3的轴.直接将3和4轴位置调换
print(np.swapaxes(x, -1,-3).shape)
#axis1=-1是值为5的轴,axis2=-3是值为3的轴.直接将3和5轴位置调换
print(np.swapaxes(x, 0,-2).shape)
#axis1=-0是值为3的轴,axis2=-2是值为4的轴.直接将3和4轴位置调换
随机样本
choice()
用法:
generator.choice(a,size,replace,p,axis)
作用:
从给定数组生成随机数组
参数:
a可以是ndarray类型也可以是int类型,如果是ndarray则从中抽样,如果是int类型则先调用arange(int n)生成[0,n)的值然后再抽样。
size输出的抽样的数组形状
replace是否可以多次抽样a 默认值是True
p数组中的各个值的概率 默认平均概率 p=none
axis数组的轴 axis=0 (0是取行,1是取列)
返回值:
返回生成的随机样本
示例:
1.
import numpy as np
x=np.random.default_rng() #设置生成器
a=np.arange(6)
b=x.choice(a,3) #在生成器中调用choice()进行选择
print(b)
2.
import numpy as np
x=np.random.default_rng() #设置生成器
a1=[[1,2,3],[4,5,6],[7,8,9]]
a2=[1,2,3,4,5,6,7,8,9]
b=x.choice(a1,1) #从a1中随机选1个行
print(b)
c=x.choice(a1,[2,2]) #从a1中随机选4个行,组成2*2的矩阵
print(c)
d=x.choice(a1,1,axis=1) #从a1中随机选一个列
print(d)
e=x.choice(a2,5,p=[0,0,0,0,0,0,0,0,1]) #a2中的概率被设置成9的概率为1,所有只能抽出5个9
print(e)
shuffle()
用法:
generator.shuffle(x,axis)
作用:
随机打乱原数组,在原有数组上‘洗牌’。不会创建新数组。
参数:
x 原数组
axis 打乱的轴
返回值:
none
示例:
import numpy as np
y=np.random.default_rng()
x=np.array([[1,2,3,4,5],[6,7,8,9,10]])
y.shuffle(x,axis=0) #按行随机打乱,总共两行,行内顺序不会被打乱(左右对应的顺序与原数组相同)
print(x)
print("\n")
y.shuffle(x,axis=1) #按列随机打乱,总共5列,列内顺序不会被打乱(上下对应的顺序与原数组相同)
print(x)
permutation()
用法:
generator.permutation(x,axis)
作用:
随机打乱原有数组,但是会生成新的数组
参数:
x如果是ndarray则随机打乱洗牌,如果是int类型则先调用arange(x)生成[0,x)再打乱随机洗牌
axis要打乱的数组的轴
返回值:
随机打乱置换后的新数组
示例:
import numpy as np
y=np.random.default_rng()
x=np.array([[1,2,3,4,5],[6,7,8,9,10]])
z=y.permutation(x,axis=0) #按行随机打乱,总共两行,行内顺序不会被打乱(左右对应的顺序与原数组相同)
print(z)
print("\n")
z=y.permutation(x,axis=1) #按列随机打乱,总共5列,列内顺序不会被打乱(上下对应的顺序与原数组相同)
print(z)
permutation与shuffle的作用效果完全相同,只是permutation有返回值,shuffle没有返回值。
2.1版本还有个permuted既可以有返回,也可以无返回值。
binomial()
二项分布抽样
用法:
geneator.binomial(n,p,size)
作用:
生成二项分布形状的随机数
参数:
n是测试的次数
p独立单次测试成功的概率
size输出的数组形状
示例:
import numpy as np
import matplotlib.pyplot as plt
d=np.random.default_rng(20100) #设置种子
c=d.binomial(2000,0.3,2000)
print(c)
weights=np.ones_like(c)/float(len(c))
plt.hist(c,20,weights=weights) #这里将输出的2000个数值聚集成20个来做图方便观看验证
plt.show()
exponenetial()
指数分布抽样
用法:
exponenetial(scale,size)
作用:
生成指数分布形状的随机数
参数:
scale B值
size输出数组的形状
示例:
import numpy as np
import matplotlib.pyplot as plt
d=np.random.default_rng(20100) #设置种子
c=d.exponential(0.3,2000)
print(c)
weights=np.ones_like(c)/float(len(c))
plt.hist(c,20,weights=weights) #这里将输出的2000个数值聚集成20个来做图方便观看验证
plt.show()
beta()
beta分布抽样
用法:
generator.beta(a,b,size)
作用:
生成beta形状的随机数
参数:
a Alpha值
b Beta值
size
示例:
import numpy as np
import matplotlib.pyplot as plt
d=np.random.default_rng(100) #设置种子
c=d.beta(2,4,2000)
print(c)
weights=np.ones_like(c)/float(len(c))
plt.hist(c,20,weights=weights) #这里将输出的2000个数值聚集成20个来做图方便观看验证
plt.show()
normal()
高斯分布(正态分布):
用法:
genertor.normal(loc,scale,size) #也可以使用numpy.random.RandomState(loc,scale,size)
作用:
生成高斯分布形状的随机数
参数:
loc 是高斯分布的平均值,中心那条线,即是高斯函数中的μ值
scale 规模(高斯函数宽度),即是高斯函数中的σ值
size 数组大小
示例:
import numpy as np
import matplotlib.pyplot as plt
d=np.random.default_rng(20100) #设置种子
c=d.normal(2,0.1,2000)
print(c)
weights=np.ones_like(c)/float(len(c))
plt.hist(c,20,weights=weights) #这里将输出的2000个数值聚集成20个来做图方便观看验证
plt.show()
下面输出的是他的x轴坐标,他的x轴上对应的每20段对应的y值相加等于1
二、基础操作
运算
加减乘除
形状大小相同的数组可以完成一一对应的加减乘除
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b=np.array([[4,5,6],[7,8,9],[10,11,12]])
print(a+b)
print(a*b)
print(a-b)
print(a/b)
当形状不一致时,如果某个维度相同,某行或某列相同,则会触发广播机制。
广播性质
广播是numpy对不同形状的数组进行数值计算的方式。
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b=np.array([[4,5,6]]) #广播行
print(a+b)
print()
a = np.array([[1],[2],[3]])
b=np.array([[1,2,3], [4,5,6],[7,8,9]]) #广播列
print(a+b)
常用操作函数
copyto()
用法:
numpy.copyto(dst,src,)
作用:
复制数组B的值到数组A,从src源数组复制到dst目标数组
参数:
dst目标数组,复制的值给谁的那个数组
src源数组,被复制的数组
示例:
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b=np.array([[4,5,6],[7,8,9],[10,11,12]])
np.copyto(b,a)
print(b)
ndim()
用法:
numpy.dim(a)
作用:
数组a的维度
参数:
a输入的数组
返回值:
返回数组a的维度
示例:
import numpy as np
a = np.array([[1,2,3], [4,5,6]])
b=np.zeros([20,50,30,1])
print(np.ndim(a))
print(np.ndim(b))
size()
用法:
numpy.size(a,axis)
作用:
计算数组中的元素值个数,如果有给定axis则返回沿axis轴上的元素值个数
参数:
a
axis
返回值:
返回元素值个数
示例:
import numpy as np
a = np.array([[1,2,3], [4,5,6]])
b=np.zeros([20,50])
print(np.size(a,axis=1))
print(np.size(b,axis=0))
以何种读取方式读取数组
reshape()
用法:
numpy.reshape(a,shape,order)
作用:
不改变数组内数据的情况下改变数组形状
参数:
a输入的要改变的数组
shape新输出的数组形状
order按照何种索引顺序读取数组值 默认C
返回值:
返回改变后的形状的数组
示例:
import numpy as np
a = np.array([[1,2,3], [4,5,6]])
np.reshape(a, 6)
print(np.reshape(a, [3,2]))
print()
print(np.reshape(a, [6,1]))
print()
print(np.reshape(a, 6))
order参数
order参数为C时,意味着按照类似c语言的数组索引顺序进行输出。
order参数为F时,意味着按照类似Fortran语言的数组索引顺序进行输出。
如果有一个二维数组,
order=C,会从[1,1],[1,2],[1,3]…[2,1][2,2]…从第一行开始列出第一行的每一列。
order=C,会从[1,1],[2,1],[3,1]…[1,2][2,2]…从第列行开始列出第一列的每一行。
import numpy as np
a = np.array([[1,2,3], [4,5,6]])
np.reshape(a, 6)
print(np.reshape(a, 6, order='F'))
print(np.reshape(a, 6, order='C'))
ravel()
用法:
numpy.ravel(a,order)
作用:
将多维数组变成一个连续的扁平数组
参数:
a 输入的多维数组
order以何种方式索引读取值进行扁平化 默认为C语言风格以行为主
返回值:
返回一个连续扁平的数组
示例:
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b=np.zeros([20,50])
print(np.ravel(a,order='C'))
print(np.ravel(a,order='F'))
print(np.ravel(b))
T(转置)
用法:
ndarray.T
作用:
矩阵转置
示例:
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b=np.array([[1,2,3],[4,5,6]])
print(a)
print()
print(a.T)
print()
print(b)
print()
print(b.T)
split()
用法:
numpy.split()
作用:
将一个数组分割成多个数组
参数:
ary 要切割的数组
indices_or_sections 切割的子数组的数目或者是切割的边界
axis按哪个轴切割
返回值:
切割后的子数组
示例:
import numpy as np
a = np.array([2,1,3,4,5,9,8,7,6])
print(np.split(a,3)) #切割成三部分
print(np.split(a,[3,6])) #切割成三部分,切割点在数组内3和6的位置
b=np.array([[2,1,8,9],[5,7,3,4],[5,10,3,8],[3,9,2,77]])
print(np.split(b,4)) #按行切割成四部分
print(np.split(b,4,axis=1)) #按列切割成四部分
排序
sort()
用法:
numpy.sort(axis,kind,order)
作用:
排序数组并返回排序后的数组副本
参数:
axis
kind
order
返回值:
返回排序后的数组副本
示例:
import numpy as np
a = np.array([2,1,3,4,5,9,8,7,6])
b=np.array([[2,1,8,9],[5,7,3,4],[5,10,3,8],[3,9,2,77]])
x=np.sort(a)
print(x)
print("\n")
y=np.sort(b,axis=0) #按行轴方向,列内排序从上到下依次变大
print(y)
print("\n")
z=np.sort(b,axis=1) #按列轴方向,列内排序从左至右依次变大
print(z)
numpy.array.sort()
用法:
array.sort(axis,kind,order)
作用:
在原数组上排序
参数:
axis
kind
order
示例:
import numpy as np
a = np.array([2,1,3,4,5,9,8,7,6])
b=np.array([[2,1,8,9],[5,7,3,4],[5,10,3,8],[3,9,2,77]])
a.sort()
print(a)
print("\n")
b.sort(axis=0) #按行轴方向,列内排序从上到下依次变大
print(b)
print("\n")
b.sort(axis=1) #按列轴方向,列内排序从左至右依次变大
print(b)
总结
Numpy库本质就是为了高效对数组(矩阵)的操作实现矩阵操作。本篇Numpy1着重介绍Numpy的基础操作,后续Numpy2将着重介绍线Numpy性代数中的操作。