解决Numpy与Pytorch彼此转换时的坑

 更新时间:2021年05月13日 09:20:14   作者:工程晓猿  
这篇文章主要介绍了解决Numpy与Pytorch彼此转换时的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

前言 ​  

最近使用 Numpy包与Pytorch写神经网络时,经常需要两者彼此转换,故用此笔记记录码代码时踩(菜)过的坑,网上有人说:

Pytorch 又被称为 GPU 版的 Numpy,二者的许多功能都有良好的一一对应。

​但在使用时还是得多多注意,一个不留神就陷入到了 一根烟一杯酒,一个Bug找一宿 的地步。

1.1、numpy ——> torch ​  

使用 torch.from_numpy() 转换,需要注意,两者共享内存。例子如下:

import torch
import numpy as np

a = np.array([1,2,3])
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print('转换后a', a)
print('转换后b', b)

# 显示

转换后a [2 3 4]
转换后b tensor([2, 3, 4], dtype=torch.int32)

1.2、torch——> numpy ​  

使用 .numpy() 转换,同样,两者共享内存。例子如下:

import torch
import numpy as np

a = torch.zeros((2, 3), dtype=torch.float)
c = a.numpy()
np.add(c, 1, out=c)
print('a:', a)
print('c:', c)

# 结果

a: tensor([[1., 1., 1.],
           [1., 1., 1.]])
c: [[1. 1. 1.]
  [1. 1. 1.]]

需要注意的是,如果将程序中的 np.add(c, 1, out=c) 改成 c = c + 1 会发现两者貌似不共享内存了,其实不然,原因是后者相当于改变了 c 的存储地址。可以使用 id(c) 发现c的内存位置变了。

补充:pytorch中tensor数据和numpy数据转换中注意的一个问题

在pytorch中,把numpy.array数据转换到张量tensor数据的常用函数是torch.from_numpy(array)或者torch.Tensor(array),第一种函数更常用。

下面通过代码看一下区别:

import numpy as np
import torch

a=np.arange(6,dtype=int).reshape(2,3)
b=torch.from_numpy(a)
c=torch.Tensor(a)

a[0][0]=10
print(a,'\n',b,'\n',c)
[[10  1  2]
 [ 3  4  5]] 
 tensor([[10,  1,  2],
        [ 3,  4,  5]], dtype=torch.int32) 
 tensor([[0., 1., 2.],
        [3., 4., 5.]])

c[0][0]=10
print(a,'\n',b,'\n',c)
[[10  1  2]
 [ 3  4  5]] 
 tensor([[10,  1,  2],
        [ 3,  4,  5]], dtype=torch.int32) 
 tensor([[10.,  1.,  2.],
        [ 3.,  4.,  5.]])

print(b.type())
torch.IntTensor
print(c.type())
torch.FloatTensor

可以看出修改数组a的元素值,张量b的元素值也改变了,但是张量c却不变。修改张量c的元素值,数组a和张量b的元素值都不变。

这说明torch.from_numpy(array)是做数组的浅拷贝,torch.Tensor(array)是做数组的深拷贝。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • python实现人脸签到系统

    python实现人脸签到系统

    这篇文章主要为大家详细介绍了python实现人脸签到系统,带数据库存储,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-04-04
  • Python使用PyMuPDF操作PDF的代码示例

    Python使用PyMuPDF操作PDF的代码示例

    PyMuPDF,也被称为fitz(这是其导入时的常用别名),是一个功能强大的Python库,用于处理PDF和其他文档格式,与 PyPDF2相比,PyMuPDF提供了更多的功能和更好的性能,特别是在处理复杂的PDF文件时,本文给大家介绍了Python使用PyMuPDF操作PDF,需要的朋友可以参考下
    2025-02-02
  • python Pexpect 实现输密码 scp 拷贝的方法

    python Pexpect 实现输密码 scp 拷贝的方法

    今天小编就为大家分享一篇python Pexpect 实现输密码 scp 拷贝的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • python 使用cx-freeze打包程序的实现

    python 使用cx-freeze打包程序的实现

    这篇文章主要介绍了python 使用cx-freeze打包程序的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Python中用post、get方式提交数据的方法示例

    Python中用post、get方式提交数据的方法示例

    最近在学习使用Python,发现网上很少提到如何使用post,所以下面这篇文章主要给大家介绍了关于Python中用post、get方式提交数据的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2017-09-09
  • python 实现堆排序算法代码

    python 实现堆排序算法代码

    python 实现堆排序算法代码,需要的朋友可以参考下
    2012-06-06
  • Python NumPy教程之数据类型对象详解

    Python NumPy教程之数据类型对象详解

    每个 ndarray 都有一个关联的数据类型 (dtype) 对象。这个数据类型对象(dtype)告诉我们数组的布局。本文将通过示例详细讲讲NumPy的数据类型对象,需要的可以参考一下
    2022-08-08
  • Python中日期和时间的互相转换操作方法

    Python中日期和时间的互相转换操作方法

    Python的datetime模块提供了一套强大而灵活的工具,使我们能够轻松地在不同的时间表示形式间相互转换,并进行复杂的时间计算,本文通过一个实用的例子向大家展示如何在Python中高效地进行这些操作,感兴趣的朋友一起看看吧
    2024-05-05
  • python3判断url链接是否为404的方法

    python3判断url链接是否为404的方法

    这篇文章主要介绍了python3判断url链接是否为404的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • numpy.where() 用法详解

    numpy.where() 用法详解

    这篇文章主要介绍了numpy.where() 用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05

最新评论