NumPy数组入门

这篇博客详细介绍了NumPy数组的基础知识,包括创建、索引、切片、拼接和分裂,以及数组计算如绝对值、三角函数、指数对数等。此外,还涉及了高级通用函数的使用,如指定输出、聚合操作和广播原理。最后,讲解了数组的排序方法和花哨的索引技巧。是深度学习前的必备预备知识。
摘要由CSDN通过智能技术生成

NumPy数组入门

Authors
Kristina(FAQ)
GitHub
https://github.com/kristina100

前言

这个暑假即将开始MindSpore框架的学习,而深度学习中所提到的张量和numpy息息相关,这一篇小小的笔记,就当作深度学习前的预备知识之一吧~
文章有点长,读者可取自己所需部分进行阅读~

GitHub上是我的一些学习记录,欢迎踩踩~
在这里插入图片描述

一、Numpy数组基础

ndarray是一种多维的数组对象
shape(表示各维度大小的元组)
dtype(用于说明数组数据类型的对象)

创建ndarray 接受一切序列型的对象 arr = np.array([…])
嵌套就转化为多维数组
arr.ndim 数组维度
arr.shape 数组形状
arr.size 数组的大小

1.1 从头创建数组
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.])
1.2 数组索引

numpy数组是固定的,插入浮点值到整型数组直接截断

1.3 数组切片

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]])
1.5 数组拼接和分裂
 #  数组拼接
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数组的计算:通用函数

使Numpy变快的关键是利用向量化的操作

2.1 绝对值

np.absolute()==np.abs()

处理复数,绝对值返回的是该复数的模

2.2 三角函数

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])
2.3 指数和对数

np.exp(x)
np.power(3,x)

给出的是以自然常数(e)为底数的对数,ln(x)=np.log(x)
以2为底,log2(x)=np.log2(x)

2.4 专用的通用函数

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])
2.5 误差函数(高斯积分)
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])

三、高级的通用函数

3.1 指定输出

大量运算的时候,有时候指定一个用于存放结果的数组
直接存入希望存入的位置

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.])
3.2 聚合
# 对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()计算中位数

3.3 数组的计算
广播的介绍

只有达到相同形状最终才可以进行计算
但是如果两个数组维度均不一样,且没有维度为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]

五、NumPy排序

# 快速排序
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])

呼~
这是自己的第一篇博客~
谢谢您的阅读鸭~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值