numpy其实就是多维数组,numpy比较重要的几个性质包括:索引切片、矩阵运算等。很多数据,例如cv2读取的图像数据都是保存为numpy格式的,所以numpy非常重要。值得注意的是,在深度学习中,pytorch框架的torchnumpy非常类似,又存在诸多不同,非常容易造成混淆,所以在掌握numpy的同时也需要掌握torch的相关用法,明确两者之间的区别。以下内容将通过对比numpytorch来进行。

numpy和torch的互相转换

在pytorch中提供了对应的支持。

numpy转torch

  1. import torch
  2. import numpy as np
  3. arr = np.array([1,2,3], dtype=float)
  4. # 转为torch
  5. arr2torch = torch.from_numpy(arr)

torch转numpy

  1. import torch
  2. import numpy as np
  3. torch_my = torch.tensor([1,2,3])
  4. # 转为torch
  5. torch2arr = torch_my.numpy()

切片和索引

切片和索引,numpytorch相同,当然他们还包括一些对应的与切片筛选操作对应的函数,例如:torch.select_index(), torch.nonzero()等。

矩阵运算

两者也差不多咯。
numpy, torch

注意事项

NumPy和torch在赋值的时候是进行引用赋值!

  1. >>> import numpy as np
  2. >>> import torch
  3. >>> a = np.array([1,2,3,4])
  4. >>> b=a
  5. >>> b[0]=100
  6. >>> a
  7. array([100, 2, 3, 4])
  8. >>>

如上所示,NumPy和torch赋值,进行引用赋值,类似指针效果。所以如果是想要进行单独的值赋值需要进行copy或者clone运算。

NumPy copy

  1. >>> import numpy as np
  2. >>> import torch
  3. >>> a = np.array([1,2,3,4])
  4. >>> b=a
  5. >>> b[0]=100
  6. >>> a
  7. array([100, 2, 3, 4])
  8. >>> c=b.copy()
  9. >>> c[0]=200
  10. >>> b
  11. array([100, 2, 3, 4])
  12. >>>

torch clone

  1. >>> import torch
  2. >>> a=torch.Tensor([1,2,3,4])
  3. >>> b=a
  4. >>> b[0]=100
  5. >>> a
  6. tensor([100., 2., 3., 4.])
  7. >>> c=b.clone()
  8. >>> c[0]=200
  9. >>> b
  10. tensor([100., 2., 3., 4.])
  11. >>>

np.where

numpy.where (condition[, x, y])
两种用法,第一种将满足条件的按指定输出,第二种将满足条件的索引输出;
此处主要讨论第二种:形如 np.where(condition),其中condition可以是数组。其输出形式为满足条件的索引(condition为数组时,即数组元素非0即为True),但是索引的输出形式为:按判断的数组维数,输出对应个数的一维数组。(也就是每个数组对应一个维度的索引)