numpy其实就是多维数组,numpy比较重要的几个性质包括:索引切片、矩阵运算等。很多数据,例如cv2读取的图像数据都是保存为numpy格式的,所以numpy非常重要。值得注意的是,在深度学习中,pytorch框架的torch和numpy非常类似,又存在诸多不同,非常容易造成混淆,所以在掌握numpy的同时也需要掌握torch的相关用法,明确两者之间的区别。以下内容将通过对比numpy和torch来进行。
numpy和torch的互相转换
numpy转torch
import torchimport numpy as nparr = np.array([1,2,3], dtype=float)# 转为torcharr2torch = torch.from_numpy(arr)
torch转numpy
import torchimport numpy as nptorch_my = torch.tensor([1,2,3])# 转为torchtorch2arr = torch_my.numpy()
切片和索引
切片和索引,numpy与torch相同,当然他们还包括一些对应的与切片筛选操作对应的函数,例如:torch.select_index(), torch.nonzero()等。
矩阵运算
注意事项
NumPy和torch在赋值的时候是进行引用赋值!
>>> import numpy as np>>> import torch>>> a = np.array([1,2,3,4])>>> b=a>>> b[0]=100>>> aarray([100, 2, 3, 4])>>>
如上所示,NumPy和torch赋值,进行引用赋值,类似指针效果。所以如果是想要进行单独的值赋值需要进行copy或者clone运算。
NumPy copy
>>> import numpy as np>>> import torch>>> a = np.array([1,2,3,4])>>> b=a>>> b[0]=100>>> aarray([100, 2, 3, 4])>>> c=b.copy()>>> c[0]=200>>> barray([100, 2, 3, 4])>>>
torch clone
>>> import torch>>> a=torch.Tensor([1,2,3,4])>>> b=a>>> b[0]=100>>> atensor([100., 2., 3., 4.])>>> c=b.clone()>>> c[0]=200>>> btensor([100., 2., 3., 4.])>>>
np.where
numpy.where (condition[, x, y])
两种用法,第一种将满足条件的按指定输出,第二种将满足条件的索引输出;
此处主要讨论第二种:形如 np.where(condition),其中condition可以是数组。其输出形式为满足条件的索引(condition为数组时,即数组元素非0即为True),但是索引的输出形式为:按判断的数组维数,输出对应个数的一维数组。(也就是每个数组对应一个维度的索引)
