这个暑假即将开始MindSpore框架的学习,而深度学习中所提到的张量和numpy息息相关,这一篇小小的笔记,就当作深度学习前的预备知识之一吧~
文章有点长,读者可取自己所需部分进行阅读~
ndarray是一种多维的数组对象
shape(表示各维度大小的元组)
dtype(用于说明数组数据类型的对象)
创建ndarray 接受一切序列型的对象 arr = np.array([…])
嵌套就转化为多维数组
arr.ndim 数组维度
arr.shape 数组形状
arr.size 数组的大小
import numpy as np
np.zeros(10, dtype=int)
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
np.ones((3,5),dtype=float)
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
np.full((3,5),3.14)
array([[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14],
[3.14, 3.14, 3.14, 3.14, 3.14]])
创建一个线性序列的数组
0开始 20结束 步长为2
np.arange(0,20,2)
array([ 0, 2, 4, 6, 8, 10, 12, 14, 16, 18])
创建一个5个元素的数组,这5个数均匀分布到0~1
np.linspace(0,1,5)
array([0. , 0.25, 0.5 , 0.75, 1. ])
创建一个(3,3),在0-1之间均匀分布的随机数组
np.random.random((3,3))
array([[0.99343462, 0.47173144, 0.38334297], [0.38642939, 0.50745929, 0.00122697], [0.2524901 , 0.42000919, 0.11096582]])
创建一个(3,3),均值为0的标准差为1的正态分布的随机数组
np.random.normal(0,1,(3,3))
array([[ 1.1119363 , 0.12037831, -0.09112545], [ 0.0207521 , -2.74302458, 0.79069395], [-1.46528679, -1.02243523, -0.37781983]])
创建一个(3,3),[0,10) 区间的的随机整型数组
np.random.randint(0,10,(3,3))
array([[8, 1, 6], [3, 3, 0], [7, 6, 1]])
创建(3,3)单位矩阵
np.eye(3)
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
创建一个由3个整型数组组成的未初始化的数组
np.empty(3)
array([1., 1., 1.])
numpy数组是固定的,插入浮点值到整型数组直接截断
x[start:stop:step]
注意哦,这个不是副本,而是直接在原来的数组上修改~
# 例如逆序
x = np.arange(10)
x[::-1]
array([9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
多维子数组
x2 = [[12,5,2,4],[7,6,8,8],[1,6,7,7]]
x2 = np.array(x2)
x2
array([[12, 5, 2, 4],
[ 7, 6, 8, 8],
[ 1, 6, 7, 7]])
# 两行三列
x2[:2,:3]
array([[12, 5, 2],
[ 7, 6, 8]])
# 所有行,每隔一列
x2[:3,::2]
array([[12, 2],
[ 7, 8],
[ 1, 7]])
# 子数组逆序
x2[::-1,::-1]
array([[ 7, 7, 6, 1],
[ 8, 8, 6, 7],
[ 4, 2, 5, 12]])
获取行和列
x2[:,0]
array([12, 7, 1])
x2[0,:]
array([12, 5, 2, 4])
x2[0]
array([12, 5, 2, 4])
创建副本
arr.copy()
#####1.4 数组变形
一般是一维数组转变为二维数组的行或列的矩阵
x=np.array([1,2,3])
x.reshape((1,3))
array([[1, 2, 3]])
# 转变为列向量
x.reshape((3,1))
array([[1],
[2],
[3]])
# 利用关键字newaxis
x[np.newaxis,:]
array([[1, 2, 3]])
x[:,np.newaxis]
array([[1],
[2],
[3]])
# 数组拼接
x = np.array([1,2,3])
y = np.array([4,4,3])
y = np.concatenate([x,y])
y
array([1, 2, 3, 4, 4, 3])
# 二维数组的拼接
gris = np.array([[1,3,4],[5,6,7]])
np.concatenate([gris,gris])
array([[1, 3, 4],
[5, 6, 7],
[1, 3, 4],
[5, 6, 7]])
np.concatenate([gris,gris],axis=1)
array([[1, 3, 4, 1, 3, 4],
[5, 6, 7, 5, 6, 7]])
np.vstack(垂直栈)
np.hstack(水平栈)
x=np.array([1,2,3])
x
array([1, 2, 3])
grid = np.array([[9,8,7],[6,5,4]])
np.vstack([x,grid])
array([[1, 2, 3],
[9, 8, 7],
[6, 5, 4]])
y=np.array([[99],[99]])
np.hstack([grid,y])
array([[ 9, 8, 7, 99],
[ 6, 5, 4, 99]])
数组的分裂
索引列表作为参数,索引列表记录的是分裂点位置
x= [1,2,3,99,99,3,2,1]
x1,x2,x3=np.split(x,[3,5])
x1
array([1, 2, 3])
N分裂点会得到N+1个子数组
grid = np.arange(16).reshape((4,4))
grid
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
upper,lower = np.vsplit(grid,[2])
upper
array([[0, 1, 2, 3],
[4, 5, 6, 7]])
lower
array([[ 8, 9, 10, 11],
[12, 13, 14, 15]])
left,right = np.hsplit(grid,[2])
left
array([[ 0, 1],
[ 4, 5],
[ 8, 9],
[12, 13]])
right
array([[ 2, 3],
[ 6, 7],
[10, 11],
[14, 15]])
使Numpy变快的关键是利用向量化的操作
np.absolute()==np.abs()
处理复数,绝对值返回的是该复数的模
np.linspace(0, np.pi, 3)—>0到Π之间均匀分布,3个元素
theta = np.linspace(0, np.pi, 3)
np.sin(theta)
array([0.0000000e+00, 1.0000000e+00, 1.2246468e-16])
np.exp(x)
np.power(3,x)
给出的是以自然常数(e)为底数的对数,ln(x)=np.log(x)
以2为底,log2(x)=np.log2(x)
Gamma函数(广义阶乘)
from scipy import special
x=[1,5,10]
special.gamma(x)
array([1.0000e+00, 2.4000e+01, 3.6288e+05])
special.gammaln(x)
array([ 0. , 3.17805383, 12.80182748])
x=np.array([0,0.3,0.7,1.0])
special.erf(x)
array([0. , 0.32862676, 0.67780119, 0.84270079])
special.erfinv(x)
array([0. , 0.27246271, 0.73286908, inf])
大量运算的时候,有时候指定一个用于存放结果的数组
直接存入希望存入的位置
x= np.arange(5)
y=np.empty(5)
np.multiply(x,10,out=y)
array([ 0., 10., 20., 30., 40.])
y=np.zeros(10)
y
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
np.power(2,x,out=y[::2])
array([ 1., 2., 4., 8., 16.])
# 对add使用reduce方法返回数组中所有元素的和
x=np.arange(1,6)
np.add.reduce(x)
15
np.multiply.reduce(x)
120
# 存储每次计算的中间结果
np.add.accumulate(x)
array([ 1, 3, 6, 10, 15], dtype=int32)
# 外积
np.multiply.outer(x,x)
array([[ 1, 2, 3, 4, 5],
[ 2, 4, 6, 8, 10],
[ 3, 6, 9, 12, 15],
[ 4, 8, 12, 16, 20],
[ 5, 10, 15, 20, 25]])
最大值最小值求和
arr.sum()
arr.min()
arr.max()
默认情况下只返回单个元素
但是可以设定参数返回每个序列
每一列最小值:
arr.min(axis=0)
每一行最小值:
arr.min(axis=1)
计算元素的乘积
np.nanprod()—nan指忽略缺失值
np.nanstd()计算标准差
np.nanvar()计算方差
np.nanargmin()找出最小值索引
np.nanmedian()计算中位数
只有达到相同形状最终才可以进行计算
但是如果两个数组维度均不一样,且没有维度为1的,则不能进行计算
x=[[5,0,3,3],
[7,9,3,5],
[2,4,7,6]]
np.count_nonzero(np.less(x,6))
np.sum(np.less(x,6),axis=1)
array([4, 2, 2])
np.any()
np.all()
# 传递索引的单个列表或者数组来获得同样的结果
# 结果形状与索引数组一致
x=np.arange(12).reshape((3,4))
x
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
row = np.array([0,1,2])
row
array([0, 1, 2])
col = np.array([2,1,3])
col
array([2, 1, 3])
x[row,col]
array([ 2, 5, 11])
其实这里第一个值是x[0,2],x[1,1],x[2,3]
# 快速排序
x=np.array([2,1,4,3,5])
# 不修改原数组
np.sort(x)
x
# 修改原数组
x.sort()
x
array([1, 2, 3, 4, 5])
# 返回原数组排好序的索引值
x=np.array([2,1,4,3,5])
i=np.argsort(x)
i
array([1, 0, 3, 2, 4], dtype=int64)
沿着行或者列排序
np.sort(x,axis=0)
np.sort(x,axis=1)
部分排序,分隔
比如k个最近邻
x=np.array([7,2,3,1,6,5,4])
np.partition(x,3)
array([2, 1, 3, 4, 6, 5, 7])
呼~
这是自己的第一篇博客~
谢谢您的阅读鸭~