numpy
其实就是多维数组,numpy
比较重要的几个性质包括:索引切片、矩阵运算等。很多数据,例如cv2
读取的图像数据都是保存为numpy
格式的,所以numpy
非常重要。值得注意的是,在深度学习中,pytorch框架的torch
和numpy
非常类似,又存在诸多不同,非常容易造成混淆,所以在掌握numpy
的同时也需要掌握torch
的相关用法,明确两者之间的区别。以下内容将通过对比numpy
和torch
来进行。
numpy和torch的互相转换
numpy转torch
import torch
import numpy as np
arr = np.array([1,2,3], dtype=float)
# 转为torch
arr2torch = torch.from_numpy(arr)
torch转numpy
import torch
import numpy as np
torch_my = torch.tensor([1,2,3])
# 转为torch
torch2arr = 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
>>> a
array([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
>>> a
array([100, 2, 3, 4])
>>> c=b.copy()
>>> c[0]=200
>>> b
array([100, 2, 3, 4])
>>>
torch clone
>>> import torch
>>> a=torch.Tensor([1,2,3,4])
>>> b=a
>>> b[0]=100
>>> a
tensor([100., 2., 3., 4.])
>>> c=b.clone()
>>> c[0]=200
>>> b
tensor([100., 2., 3., 4.])
>>>
np.where
numpy.where (condition[, x, y])
两种用法,第一种将满足条件的按指定输出,第二种将满足条件的索引输出;
此处主要讨论第二种:形如 np.where(condition)
,其中condition
可以是数组。其输出形式为满足条件的索引(condition为数组时,即数组元素非0即为True),但是索引的输出形式为:按判断的数组维数,输出对应个数的一维数组。(也就是每个数组对应一个维度的索引)