获取数组中的部分元素除了通过指定索引标签来实现外,还可以通过使用一些函数来实现,如通过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)