Numpy基础(2.0)

获取数组中的部分元素除了通过指定索引标签来实现外,还可以通过使用一些函数来实现,如通过random.choice函数从指定的样本中随机抽取数据。

import numpy as np
from numpy import random as nr
a=np.arange(1,25,dtype=float)
c1=nr.choice(a,size=(3,4))
c2=nr.choice(a,size=(3,4),replace=False)
c3=nr.choice(a,size=(3,4),p=a/np.sum(a))
print("随机可重复抽取")
print(c1)
print("随机但不重复抽取")
print(c2)
print("随机但按指定概率抽取")
print(c3)

1.3 Numpy的算术运算

在机器学习和深度学习中,涉及大量的数组或矩阵运算,下面来介绍两种常用的运算。一种是对应元素相乘,又称为逐元乘法,运算符为np.multiply,或*。另一种是点积或内积元素,运算符为np.dot().

1.3.1对应元素相乘

对应元素相乘(Element-Wise Product)是两个矩阵中对元素成绩。no.multiply函数用于数组或矩阵对应元素相乘,输出与相乘数组或矩阵的大小一致,其格式如下:

numpy.multiply(x1,x2, /,out=None,*, where=True,casting='same_kind',order='K',dtype=None,subok=True[,signature,extobj])

其中x1,x2之间的对应元素相乘遵守广播规则,Numpy的广播规则在下面会介绍。首先我们通过一些实例来进一步说明。

import numpy as np
from numpy import random as nr
A =np.array([[1,2],[-1,4]])
B =np.array([[2,0],[3,4]])
print(A*B)
print(np.multiply(A,B))

Numpy数组不仅可以和数组进行对应元素相乘,还可以和单一数值(标量)进行运算。运算时,Numpy数组中的每个元素都和标量进行运算,其间会用到广播机制。

 由此,推而广之,数组通过一些激活函数后,输出与输入形状一致。

import numpy as np
from numpy import random as nr
X=np.random.rand(2,3)
def softmoid(x):
    return 1/(1+np.exp(-x))
def relu(x):
    return np.maximum(0,x)
def softmax(x):
    return  np.exp(x)/np.sum(np.exp(x))
print("输入参数X的形状:",X.shape)
print("激活函数softmoid输出形状:",softmax(X).shape)
print("激活函数ReLU的输出形状:",relu(X).shape)
print("激活函数softmax输出形状:",softmax(X).shape)

 

1.3.2 点积运算

 点积运算(Dot Product)又称为内积,在Numpy用np.dot表示,其一般格式为:

numpy.dot(a,b,out=None)

一下通过一个实例来说明dot的具体使用方法及注意事项。

import numpy as np
from numpy import random as nr
x1=np.array([[1,2],[3,4]])
x2=np.array([[5,6,7],[8,9,10]])
x3=np.dot(x1,x2)
print(x1.shape)
print(x2.shape)
print(x3.shape)
print(x3)

这里的点积运算和线性代数的矩阵运算规则是一样的,这里是2*2的矩阵与2*3的矩阵做点积,生成2*3的矩阵。(规则是第一个矩阵的列必须要和第二个矩阵的行数相同,否则会报错) 

1.4数组变形

在极其学习以及深度学习的任务中,通常需要将处理好的数据以模型能接受的格式输入给模型,然后由模型通过一系列的运算,最终返回一个处理结果。然而,由于不同模型所接受的输入格式不一样,往往需要先对其进行一系列的变形和运算,从而将数据处理成符合模型要求的格式。在矩阵或者数组的运算中,将鹤城那个会遇到多个向量或矩阵按轴方向合并,或展平(如在卷积或循环神经网络中,在全连接层之前,需要把矩阵展平)的情况。

1.4.1更改数组的形状

修改制定数组的形状是Numpy中最常见的操作之一,常见的方法有很多,如下表所示:

函数描述
arr.reshape重新将向量arr的维度进行改变,不改变向量本身
arr.resize重新将向量arr维度进行改变,修改向量本身
arr.T对向量arr进行转置
arr.ravel对象量arr进行展平,即将多维数组编程1位数组,不会产生原数组的副本
arr.flatten对向量arr进行展平,即将多维数组编程1位数组,返回原数组的副本
arr.squeeze只能对味素为1的维度进行降维。对多维数组使用时不会报错,但是不会产生任何影响
arr.transpose对高维矩阵进行轴对换

下面来看一些实例:

1.reshape

改变向量的维度(不修改向量本身):

import numpy as np
arr=np.arange(10)
print(arr)
b=arr.reshape(2,5)
print(b)
c=arr.reshape(-1,5)
print(c)

值得注意的是,如果至指定行数或列数,其余的用-1表示。且所指定的行数或列数一定要能被整除,例如上面代码如果修改为arr.shape(3,-1)即为错误的。

2.resize

改变向量的维度(修改向量本身)

import numpy as np
import random
arr=np.random.random([4,4])
print(arr)
arr.resize((2,8))
# c=arr.resize((-1,5))
# print(c)
print(arr)
# print(b)
# c=arr.resize(-1,5)
# print(c)

 

这里注意resize和reshape的写法,resize必须单独成行,不能写入到print语句里,并且一旦resize之后,不能再次被resize,而reshape却可以多次reshape。

3.T

向量转置:

import numpy as np
import random
arr=np.arange(12).reshape(3,4)
print(arr)
print(arr.T)

 4.ravel

向量展平:

import numpy as np
arr=np.arange(6).reshape(2,-1)
print(arr)
print("按照列优先,展平")
print(arr.ravel('F'))
print("按照行优先,展平")
print(arr.ravel())

 

5.flatten

把矩阵转换为向量,这种需求经常出现在卷积网络与全连接层之间。

import numpy as np
arr=np.random.random((3,4))
print(arr)
print(arr.flatten())

 6.squeeze

这是一个主要用来降维的函数,把矩阵中含1的维度去掉。在pytorch中海油一种与之相反的操作--torch.unsqueeze。

import numpy as np
import torch
arr=np.arange(3).reshape(3,1)
print(arr.shape)
b=arr.squeeze()
print(b.shape)
c=torch.unsqueeze(torch.tensor(b),1)
print(c.shape)
arr1=np.arange(6).reshape(3,1,2,1)
print(arr1.shape)
print(arr1.squeeze().shape)

 7、transpose

对高维矩阵进行轴转换,这个在深度学习中经常使用,比如把图片中表示颜色顺序的RGB改为GBR

import numpy as np

arr2=np.arange(24).reshape(2,3,4)
print(arr2.shape)
print(arr2.transpose(1,2,0).shape)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mez_Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值