t = np.array([0., 1., 2., 3., 4., 5., 6.,])
print(t)
- np.array(...)는 NumPy 배열 객체(ndarray) 를 생성하는 함수입니다.
- [0., 1., 2., 3., 4., 5., 6.]는 실수형 숫자들로 이루어진 리스트(list)입니다.
- 0.은 0.0, 즉 실수형(float)입니다.
- 리스트 안에 실수만 있으므로, NumPy는 float64 타입의 배열로 만듭니다.
print('Rank of t: ', t.ndim)
print('Shape of t: ', t.shape)
첫 번째 줄에서는 t.ndim을 출력합니다. 이건 배열 t의 차원 수를 알려줍니다. 예를 들어 t가 1차원 배열이면 결과는 1이 됩니다. 즉, 이 코드는 t라는 배열이 몇 차원인지 보여주는 것입니다.
두 번째 줄에서는 t.shape을 출력합니다. 이건 배열 t의 모양 또는 크기를 의미합니다. 예를 들어 t에 숫자 7개가 들어 있는 1차원 배열이라면 t.shape의 값은 (7,)이 됩니다. 이건 "길이가 7인 1차원 배열이다"라는 뜻입니다.
t = np.array([[1., 2., 3.], [4., 5., 6.], [7., 8., 9.], [10., 11., 12.]])
print(t)
2차원 배열을 만드는 코드입니다. 이 배열은 4개의 행과 3개의 열을 가진 형태입니다. 각각의 내부 리스트가 한 줄(행)을 의미합니다.
- 첫 번째 행: 1.0, 2.0, 3.0
- 두 번째 행: 4.0, 5.0, 6.0
- 세 번째 행: 7.0, 8.0, 9.0
- 네 번째 행: 10.0, 11.0, 12.0
여기서 숫자 뒤에 점이 붙은 이유는 모두 실수(float) 타입이기 때문입니다. print(t)를 하면 이 배열이 행렬처럼 출력됩니다. 전체적으로 보면 4행 3열짜리 표처럼 생긴 숫자 배열이 나타납니다.
파이토치 이용
t = torch.FloatTensor([0., 1., 2., 3., 4., 5., 6.])
print(t)
torch의 float형 Tensor로 t를 만듭니다 .
dim은 차원, shape는 어느정도인지, size라는 함수를 사용할 수 있고 이는 shape와 같ㅇ습니다.
마찬가지로 element 알 수 있고, slicing 했을 때도 알 수 있습니다.
print(t.dim()) # rank
print(t.shape) # shape
print(t.size()) # shape
print(t[0], t[1], t[-1]) # Element
print(t[2:5], t[4:-1]) # Slicing
print(t[:2], t[3:]) # Slicing
t = torch.FloatTensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.],
[10., 11., 12.]
])
print(t)
print(t.dim()) # rank
print(t.size()) # shape
print(t[:, 1])
print(t[:, 1].size())
print(t[:, :-1])
Broadcasting
파이토치에서는 boradcasting이라는 걸 제공합니다. matrix는 덧셈 뺼셈을 할 때 두 텐서간의 크기가 같아야 한다는 법칙이 존재하며 곱같은 것을 수행할 때 , 행렬 곱을 수행할 때도 첫번째차원과 마지막 차원이 일치해야 한다는 규칙이 있습니다.
우리는 불가피하게 다른 크기의 행렬들을 텐서들을 더하거나 빼는 사칙연산을 수행하는 것이 발생할 수 있는데 broadcasting 기능으로 자동적으로 사이즈를 맞출 수 있습니다.
m1 = torch.FloatTensor([[3, 3]])
m2 = torch.FloatTensor([[2, 2]])
print(m1 + m2)
# Vector + scalar
m1 = torch.FloatTensor([[1, 2]])
m2 = torch.FloatTensor([3]) # 3 -> [[3, 3]]
print(m1 + m2)
# 2 x 1 Vector + 1 x 2 Vector
m1 = torch.FloatTensor([[1, 2]])
m2 = torch.FloatTensor([[3], [4]])
print(m1 + m2)
자동으로 실행되기 때문에 사용자 입장에서 주의해서 실행을 해야 합니다. 실수를 해서 두 matrix 와 tensor의 사이즈가 같아야 했음에도 불구하고 다른 사이즈가 계산이 되어서 더해지거나 빼지게 된다면 원래 에러가 나서 종료가 되어야 하는 것을 만약 종료가 된다면 알 수 있지만 자동적으로 브로드캐스팅을 한다면 나중에 프로그램이 에러없이 종료되었을 때, 어디에서 잘못되었는가?
이걸 찾을 때 어려움을 느끼기에 조심해야 하는 부분이 있습니다.
Matrix Multiplication
multiplication과 matrix multiplication은 다릅니다.
(2x2) (2x1) 뒤와 앞이 일치하면 되기 때문에 이는 2x1 이 되는 것을 알 것입니다.
MEAN
t = torch.FloatTensor([1, 2])
print(t.mean())
# Can't use mean() on integers
t = torch.LongTensor([1, 2])
try:
print(t.mean())
except Exception as exc:
print(exc)
이렇게 LongTensor에 대해서는 못하는 걸 볼 수 있습니다.
Max and Argmax
t = torch.FloatTensor([[1, 2], [3, 4]])
print(t)
print(t.max()) # Returns one value: max