칼럼의 개수가 n개라면 각 데이터는 n차원의 공간의 한 점으로 표현할 수 있다.
열이 4개인 경우 4차원이다.
x1 = np.array([5.1,3.5,1.4,0.2])
print(x1.ndim, x1.shape)
결과 : 1 (4,)
위와 같이 하나의 배열에 값이 들어가있는 모양을 1차원이라고 한다.
x1의 shape를 출력하면 숫자가 1개 들어있으므로 1차원이다.
숫자가 4인것은 4개의 요소를 지니고 있다는 뜻이다.
x2 = np.array([4.9,3.0,1.4,0.2])
x3 = np.array([4.7, 3.2, 1.3, 0.2])
아이리스 = np.array([x1,x2,x3])
print(아이리스.ndim, 아이리스.shape)
결과 : 2 (3,4)
1차원의 배열 3개를 품고 있는 배열 하나 ([x1, x2, x3])가 만들어졌다. 배열의 깊이가 2가 되었고 깊이가 2라서 shape를 출력하면 두개의 숫자 (3,4)가 들어 있다. 이것을 2차원 형태라고 한다.
이처럼 차원을 말할 때 데이터의 형태를 표현하는 맥락에서 사용하면 배열의 깊이는 차원수가 된다.
배열의 깊이 = 차원수
차원이라는 말은 맥락에 따라 다르게 사용된다. 변수의 개수를 차원수로 이해할 때도 있고, 배열의 깊이를 차우너수라고 이해할 때도 있다.
img1 = np.array([
[ 0, 255],
[255, 0]
])
print(img1.ndim, img1.shape)
결과 : 2 (2,2)
샘플로 구성한 데이터는 (2,2) 모양을 가지고 있다.
img2 = np.array([[255, 255], [255, 255]])
img3 = np.array([[0,0],[0,0]])
왼쪽의 관측치를 2개 추가했듯이 이미지를 2개 더 추가한다.
img1을 만들 때 작성한 코드와 달라 보이지만 같은 형태의 데이터를 만드는 코드이다.
아이리스 = np.array([x1, x2, x3])
print(아이리스.ndim, 아이리스.shape)
결과 : 2 (3,4)
관측치를 모아 하나의 표를 구성했다.
이미지셋 = np.array([img1, img2, img3])
print(이미지셋.ndim, 이미지셋.shape)
결과 : 3 (3,2,2)
이미지들을 모아서 이미지셋을 구성했다. 이렇게 만들어진 이미지셋은 3차원 형태로 표현되어 있고 (3,2,2) 모양인 것을 알 수 있다.
x1,x2,x3와 img1, img2, img3는 가지고 있는 요소들의 개수가 4개이다. 데이터 형태를 표현하는 관점에서 x1은 1차원 형태, img1은 2차원 형태로 서로 다르지만, 데이터 공간의 맥락에서는 x1과 img1 모두 동일하게 4차원 간의 한 점으로 표현할 수 있는 관측치이다.
d1 = np.array([1,2,3])
print(d1.ndim, d1.shape)
결과 : 1 (3, )
d1은 1차원 형태의 데이터이다. shape를 출력하면 3이라는 숫자 하나 뿐이다.
d2 = np.array([d1,d1,d1,d1,d1])
print(d2.ndim, d2.shape)
결과 : 2 (5,3)
d2는 d1을 5개 가지고 있다. 2차원 형태이고, shape를 출력하면 5와 3 두개의 숫자를 가지고 있으므로 2차원형태이다.
이렇게 1차원, 2차원 등 여러 차원 형태로 구성된 데이터의 모습을 텐서라고 한다.
텐서플로는 이러한 텐서가 흘러가면서 모델을 학습한다는 것에 착안하였다.
데이터 공간의 맥락에서는 '변수의 개수'가 차원의 수이다.
데이터 형태의 맥락에서는 '배열의 깊이'가 차원의 수이다.