반응형
Pytorch의 Tensor(텐서) 조작하기 1¶
import torch
import numpy as np
Tensor(텐서) 를 만드는 다양한 방법¶
empty¶
주어진 크기의 아무값으로도 초기화되지 않은 텐서를 만든다. 텐서 성분의 값들은 쓰레기값들이다.
torch.empty(4)
tensor([ 1.6751e-37, -1.9427e-13, 1.6751e-37, -1.9427e-13])
torch.empty((4,5))
tensor([[0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00, 1.4013e-45, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00], [0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00, 0.0000e+00]])
torch.empty(2,3)
tensor([[4.1102e+08, 4.5579e-41, 2.7585e-36], [0.0000e+00, 2.7548e-36, 0.0000e+00]])
torch.empty(2,3,dtype=torch.int)
tensor([[1304689952, 32526, 74107072], [ 0, 32, 0]], dtype=torch.int32)
zeros¶
주어진 크기의 0으로 초기화된 텐서를 만든다.
torch.zeros(5)
tensor([0., 0., 0., 0., 0.])
torch.zeros((2,3))
tensor([[0., 0., 0.], [0., 0., 0.]])
torch.zeros(5,6,dtype=torch.bool)
tensor([[False, False, False, False, False, False], [False, False, False, False, False, False], [False, False, False, False, False, False], [False, False, False, False, False, False], [False, False, False, False, False, False]])
ones¶
주어진 크기의 1로 초기화된 텐서를 만든다.
torch.ones(5)
tensor([1., 1., 1., 1., 1.])
torch.ones(2,4)
tensor([[1., 1., 1., 1.], [1., 1., 1., 1.]])
torch.ones((2,3))
tensor([[1., 1., 1.], [1., 1., 1.]])
torch.ones(3,dtype=torch.bool)
tensor([True, True, True])
full¶
주어진 크기의 정해준 값으로 채운 텐서를 만든다.
torch.full((1,2),3.14)
tensor([[3.1400, 3.1400]])
torch.full((2,3),2.718)
tensor([[2.7180, 2.7180, 2.7180], [2.7180, 2.7180, 2.7180]])
eye¶
주어진 크기의 대각성분만 1인 텐서를 만든다.
torch.eye(3)
tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])
torch.eye(5,3)
tensor([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.], [0., 0., 0.], [0., 0., 0.]])
a = np.array([1,2,3])
b = torch.as_tensor(a)
~like¶
입력받은 텐서와 같은 크기의 텐서를 만든다.
data = torch.zeros(3,4)
torch.empty_like(data)
tensor([[0.0000e+00, 0.0000e+00, 7.7052e+31, 7.2148e+22], [2.5226e-18, 2.5930e-09, 1.0186e-11, 7.7198e-10], [6.6767e-07, 4.0061e-11, 4.1727e-08, 2.9572e-18]])
torch.zeros_like(data)
tensor([[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]])
torch.ones_like(data)
tensor([[1., 1., 1., 1.], [1., 1., 1., 1.], [1., 1., 1., 1.]])
torch.full_like(data,2.717)
tensor([[2.7170, 2.7170, 2.7170, 2.7170], [2.7170, 2.7170, 2.7170, 2.7170], [2.7170, 2.7170, 2.7170, 2.7170]])
tensor¶
입력받은 데이터로 텐서를 만든다. 이때 값은 복사된다.
data = np.array([1,2,3,4,5,6])
t = torch.tensor(data)
print(t,t.dtype)
tensor([1, 2, 3, 4, 5, 6]) torch.int64
t = torch.tensor(data,dtype=torch.float32)
print(t,t.dtype)
tensor([1., 2., 3., 4., 5., 6.]) torch.float32
t = torch.tensor(data)
t[0] = 999
print("Tensor values : ",t,"\nOriginal np array values : ",data)
Tensor values : tensor([999, 2, 3, 4, 5, 6]) Original np array values : [1 2 3 4 5 6]
as_tensor¶
입력받은 데이터로 텐서를 만든다는 점에선 tensor와 같다. 그러나 원본과 만들어진 텐서가 같은 cpu상에서 동작할 경우 원본의 값을 복사하지 않고 참조하기 때문에 텐서의 값을 바꾸면 원본 데이터의 값도 변한다. 또, 이 원본 데이터를 참조하고 있는 모든 텐서의 값도 변한다.
data = np.array([1,2,3,4,5,6])
t = torch.as_tensor(data)
print(t)
tensor([1, 2, 3, 4, 5, 6])
t[0] = 999
print("Tensor values : ",t,"\nOriginal np array values : ",data)
Tensor values : tensor([999, 2, 3, 4, 5, 6]) Original np array values : [999 2 3 4 5 6]
data = np.arange(5)
print(data)
[0 1 2 3 4]
t1 = torch.as_tensor(data)
t2 = torch.as_tensor(data)
print("t1 : ",t1)
print("t2 : ",t2)
t1 : tensor([0, 1, 2, 3, 4]) t2 : tensor([0, 1, 2, 3, 4])
t2[0] = 999
print("original np data : ",data)
print("t1 : ",t1)
print("t2 : ",t2)
original np data : [999 1 2 3 4] t1 : tensor([999, 1, 2, 3, 4]) t2 : tensor([999, 1, 2, 3, 4])
FloatTensor, IntTensor, ... etc¶
tensor처럼 데이터를 복사하여 만든다.
data = np.array([0,1,2,3,4,5])
torch.FloatTensor(data)
tensor([0., 1., 2., 3., 4., 5.])
torch.IntTensor(data)
tensor([0, 1, 2, 3, 4, 5], dtype=torch.int32)
torch.BoolTensor(data)
tensor([False, True, True, True, True, True])
아래 코드에서 값이 변하지 않는다는것을 알 수 있다.
data = np.array([0,1,2,3,4])
t1 = torch.FloatTensor(data)
print("data : ",data)
print("t1 : ",t1)
t1[0] = 9999
print("data : ",data)
print("t1 : ",t1)
data : [0 1 2 3 4] t1 : tensor([0., 1., 2., 3., 4.]) data : [0 1 2 3 4] t1 : tensor([9.9990e+03, 1.0000e+00, 2.0000e+00, 3.0000e+00, 4.0000e+00])
t1[0] = 9999
print("data : ",data)
print("t1 : ",t1)
data : [0 1 2 3 4] t1 : tensor([9.9990e+03, 1.0000e+00, 2.0000e+00, 3.0000e+00, 4.0000e+00])
arange¶
range도 있지만, 사용시 언젠가 제거될 예정이니 사용하지 말라고 경고가 뜬다. 반드시 필요한 경우가 아니라면 arange를 써주도록 하자.
torch.arange(5)
tensor([0, 1, 2, 3, 4])
torch.arange(1,4,2)
tensor([1, 3])
torch.arange(3,4,0.2)
tensor([3.0000, 3.2000, 3.4000, 3.6000, 3.8000])
torch.range(0,4)
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:1: UserWarning: torch.range is deprecated and will be removed in a future release because its behavior is inconsistent with Python's range builtin. Instead, use torch.arange, which produces values in [start, end). """Entry point for launching an IPython kernel.
tensor([0., 1., 2., 3., 4.])
linspace, logspace¶
torch.linspace(0,10,20)
tensor([ 0.0000, 0.5263, 1.0526, 1.5789, 2.1053, 2.6316, 3.1579, 3.6842, 4.2105, 4.7368, 5.2632, 5.7895, 6.3158, 6.8421, 7.3684, 7.8947, 8.4211, 8.9474, 9.4737, 10.0000])
torch.logspace(0,10,20)
tensor([1.0000e+00, 3.3598e+00, 1.1288e+01, 3.7927e+01, 1.2743e+02, 4.2813e+02, 1.4384e+03, 4.8329e+03, 1.6238e+04, 5.4556e+04, 1.8330e+05, 6.1585e+05, 2.0691e+06, 6.9519e+06, 2.3357e+07, 7.8476e+07, 2.6367e+08, 8.8587e+08, 2.9764e+09, 1.0000e+10])
complex¶
실수, 허수 부분의 텐서들을 받아서 복소수텐서를 만든다.
real = torch.FloatTensor([1,2,3])
img = torch.FloatTensor([4,5,6])
torch.complex(real,img)
tensor([1.+4.j, 2.+5.j, 3.+6.j])
반응형
'Study > Python' 카테고리의 다른 글
Python 문자열(string) 그냥 한번 대충 보기 (0) | 2021.04.14 |
---|---|
Python에서 Glob으로 파일 혹은 폴더의 경로 불러오기 (0) | 2021.03.26 |
Kaggle에서 Pytorch로 간단한 Mnist 숫자 분류기 만들기 (0) | 2021.03.16 |
Pytorch로 선형 회귀(Linear Regression) 구현하기 (0) | 2021.03.15 |
.py를 .ipynb으로, 또 그 반대로 (3) | 2020.10.17 |
댓글