Numpy和pytorch都是數(shù)據(jù)分析和機器學(xué)習常用的python第三方工具庫,他們都可以對矩陣類型的數(shù)據(jù)進行操作。也就是說他們都有矩陣類型的數(shù)據(jù)結(jié)構(gòu),實際上他們也是可以進行互相轉(zhuǎn)換的,而且這樣的需求在神經(jīng)網(wǎng)絡(luò)中經(jīng)常遇到。那么怎么進行Numpy與pytorch互轉(zhuǎn)呢?接下來的這篇文章帶你了解!
前言 ???
最近使用 Numpy包與Pytorch寫神經(jīng)網(wǎng)絡(luò)時,經(jīng)常需要兩者彼此轉(zhuǎn)換,故用此筆記記錄碼代碼時踩(菜)過的坑,網(wǎng)上有人說:
Pytorch 又被稱為 GPU 版的 Numpy,二者的許多功能都有良好的一一對應(yīng)。
?但在使用時還是得多多注意,一個不留神就陷入到了 一根煙一杯酒,一個Bug找一宿 的地步。
1.1、numpy ——> torch ???
使用 torch.from_numpy() 轉(zhuǎn)換,需要注意,兩者共享內(nèi)存。例子如下:
import torch
import numpy as np
a = np.array([1,2,3])
b = torch.from_numpy(a)
np.add(a, 1, out=a)
print('轉(zhuǎn)換后a', a)
print('轉(zhuǎn)換后b', b)
# 顯示
轉(zhuǎn)換后a [2 3 4]
轉(zhuǎn)換后b tensor([2, 3, 4], dtype=torch.int32)
1.2、torch——> numpy ???
使用 .numpy() 轉(zhuǎn)換,同樣,兩者共享內(nèi)存。例子如下:
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)
# 結(jié)果
a: tensor([[1., 1., 1.],
[1., 1., 1.]])
c: [[1. 1. 1.]
[1. 1. 1.]]
需要注意的是,如果將程序中的 np.add(c, 1, out=c) 改成 c = c + 1 會發(fā)現(xiàn)兩者貌似不共享內(nèi)存了,其實不然,原因是后者相當于改變了 c 的存儲地址。可以使用 id(c) 發(fā)現(xiàn)c的內(nèi)存位置變了。
補充:pytorch中tensor數(shù)據(jù)和numpy數(shù)據(jù)轉(zhuǎn)換中注意的一個問題
在pytorch中,把numpy.array數(shù)據(jù)轉(zhuǎn)換到張量tensor數(shù)據(jù)的常用函數(shù)是torch.from_numpy(array)或者torch.Tensor(array),第一種函數(shù)更常用。
下面通過代碼看一下區(qū)別:
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,'
',b,'
',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,'
',b,'
',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
可以看出修改數(shù)組a的元素值,張量b的元素值也改變了,但是張量c卻不變。修改張量c的元素值,數(shù)組a和張量b的元素值都不變。
這說明torch.from_numpy(array)是做數(shù)組的淺拷貝,torch.Tensor(array)是做數(shù)組的深拷貝。
以上就是怎么進行Numpy與pytorch互轉(zhuǎn)的全部內(nèi)容,希望能給大家一個參考,也希望大家多多支持W3Cschool。