저번에는 기본적인 제어문인 IF문에 대해서 알아 보았습니다. IF문은 A하면 B한다라는 언어인 반면, 반복문은 A라는 조건을 만족하면, B를 계속 실행한다. 입니다. 반복문에는 큰 틀에서 While문과 For문 두 가지가 있습니다. 두 구문의 차이를 구별하면 For문은 반복 횟수를 정확히 알 경우에 사용하고, While문은 반복 횟수를 정확히 모를 때 사용합니다.

 그리고 사실 While문은 반보문으로, 여러구문을 처리해주는 역할을 담당하긴 하지만, 이 구문 자체만으로는 그다지 큰 쓸모가 없습니다. 나중에 학습할 For문이 개인적으로 더 간략하고, 사용하기 쉽기 때문이죠. 그 보다는 Break, Continue문과 함꼐 쓰입니다.

 

말로 하는 것 보다는 실제 코드를 보면서 하는 편이 나을 것 같습니다. 먼저 가장 간단한 While문의 구조부터 보겠습니다.

 

1. While
import numpy as np
:
A = 0
i = 0

 

while A < 10:
    A = A+1
    print("%d" %A)
A

 

1 2 3 4 5 6 7 8 9 10

while 조건:

코드

기본적인 구조는 매우 간단합니다. 정수 A 0이 10이 될 때까지 하나 씩 더해가면서, 형식 지정자를 정수(%d)로 해서 출력하면 위와 같은 결과가 나옵니다.

2. While + Break

Break문은 반복문에서만 사용 할 수 있는 구문으로, 반복문을 중단하고 프로그램의 프로세스를 일종의 Main 구문으로 빠져나가게 하는 구문입니다. 프로그램이 짧은 경우에는 상관이 별로 없지만, 프로그램이 길어지는 경우에, 특정 경우 특정 반복문을 실행하고, 아닌 경우 빠져나와야 할 경우에 자주 사용 됩니다. 다음의 예시를 살펴 보겠습니다.

while A<10: in_text = input("-m: 숫자세기, -q:종료") if in_text == "-q": break elif in_text =="-m": A = A+1 A

 

 

-m: 숫자세기 -q:종료 m

-m: 숫자세기 -q:종료 q

이 코드를 한 번에 이해하셨다면 이 포스팅을 보실 이유도 별로 없으시겠지만, 일단 line by line으로 좀 해석을 하면, 아직 설명하지 않았지만 input이라는 변수에 사용자가 문자나 숫자를 입력을 할 수 있습니다. 그래서 이것을 in_text라는 변수에 집어 넣었는데, 이것이 만약에 -q이면 break 구문을 써서 반복문을 빠져나가서 A를 출력합니다. 그러면 A에 아무것도 들어 있지 않으므로 당연히 아무것도 출력되지 않을 것입니다. 반면에 -m을 집어 넣으면 A에 +1 을 하도록 설정합니다.

 

Code가 조금 복잡해지긴 했지만, 맨 처음의 코드보다 훨씬 쓸모가 많을 것 같습니다. 처음의 코드도 응용 여부에 따라 쓸모는 많겠죠. 제가 못 찾은 것일 지도-_-

 

 

3. Continue

 

]:
while A < 10:
    A += 1
    if A == 5:
        continue
    print(A)
1
2
3
4
6
7
8
9
10

 

Continue문은 특정 값일 때 제어를 반복문의 바깥으로 돌려주지 않고 반복문의 맨 처음으로 옮겨 줍니다. 나중에 for문에서도 같이 알아 볼 테니 간단하게만 코딩하고 가도록 하겠습니다. 지금까지 코딩하면서 사실 많이 사용하진 않았으니까요. 머리가 나쁘면 몸이 고생한다고 그냥 노가다(?)로 해결이 가능한 부분인 것 같기도 합니다. -_-

 

 

 

 

'머신러닝 > 기초 문법' 카테고리의 다른 글

9. 함수  (0) 2019.02.12
8. FOR문  (0) 2019.02.11
6. IF 문  (0) 2019.02.09
주피터 노트북 블로그에 맞기 정렬하기  (0) 2019.02.08
넘파이 기초 - 배열 생성(1)  (0) 2019.01.31

윈도우는 하드웨어(남은 용량이나 메모리에 관한 정보) 와 CPU 정보(코어, I5, I7등)을 확인 하는 것이 GUI이므로 상당히 쉽습니다. 하지만 우분투는 CUI이므로 익숙한 사람이 아니면 사용하기 여렵습니다. 다행히 최근에는 인터넷에 정보가 넘쳐나다보니, 쉽게 관련 정보를 검색 할 수 있습니다.

1. 하드웨어 정보 확인.

 

$ df -h

sda1장치에 설치되는 것을 확인해야 하므로 used, availabe을 통해 쉽게확인 할 수 있습니다. 참고로 -h옵션을 쓰지 않으면 킬로바이트로 읽도록 나옵니다. 그러면 읽기가 매우 힘들기 때문에 -h를 쓰는 것을 권장합니다.

2. CPU 정보 확인

먼저 알아 둘 것은 /proc/cpuinfo 아래에 모든 cpu 정보가 존재한다는 것입니다. 따라서 전체 CPU정보를 확인하려면

$ cat /proc/cpuinfo

 

우분투글에서 리눅스 관련 글이 많아지면 리눅스 카테고리를 따로 만들어서 정리할 예정입니다. 우분투가 가벼워서 좀 낮은 사양의 PC에서 돌아가기도 좋고 고사양의 PC에서는 무거운 프로그램을 돌리기에도 좋은 것 같거든요.

 이제 파이썬에서 자료형을 보았으니 그렇게 본 자료형들을 어떻게 처리 할지, 프로그램을 제어해야 할 것 같습니다. 따라서, 프로그램의 제어문에 대해서 보도록 하겠습니다. 즉 처리를 하는데, A 가 무엇무엇하면 B를 하고 아니면 C를 한다, A를 몇 번 실행한다. 이런 것을 학습하도록 하는데, 맨 처음에 학습하는 IF문은 말 그대로, IF 즉 조건문입니다. 


IF는 대표적으로 IF, 그리고 If - Else, IF-Elif-Else 마지막으로 중복 IF문으로 나눠 볼 수 있는데, 단독 IF문의 사용은 If-Elif의 사용에서 충분히 알 수 있으므로 이번에는 If-Elif-(Else), 그리고 중복 If문에 대해서만 살펴 보도록 하겠습니다. 


1. If - Elif - Else 문. 


If - Elif - Else문

먼저 If문을 실행해서 조건을 살펴 본 다음에, 조건이 맞으면 If문의 조건 밑의 코드를 실행합니다. 그리고 나머지는 무시하고 실행하지 않는다. 

If 조건:

Code


Elif 조건:

Code


Else: 

Code


주) If1 - If2 - If3 의 코드 일 경우에는 If문1의 조건을 보고 조건이 맞으면 코드를 실행하고, If문2의 조건을 보고 조건이 맞으면 코드를 실행하고, If문3의 조건을 보고 조건이 맞으면 코드를 실행하고.....를 반복한다. 처음에 대체 If - Elif와 If - If의 차이가 뭔지 궁금했는데 제대로 알려 주는 곳이 없어서 적어 둡니다 

그 다음에 Elif의 조건을 보고 만약에 조건이 맞다면 코드를 실행하다고 그렇지 않다면 Else문을 실행합니다. Else문은 존재하지 않고, Elif로 끝나도 되지만 Elif로 해결되지 못하는 나머지 모든 조건에 코드를 실행해야 할 경우에 사용합니다. 그렇지 않을 경우, 여러 개의 Elif문을 사용해야 합니다. 코드가 좀 길어 지겠지만 Elif를 쓰는 게 확실하긴 하겠죠. 참고로 Elif는 Else - if의 준말로 우리 말로는 그렇지 않으면 입니다. 다른 언어에서는 Elseif입니다. 



대표적인 성적 예시를 살펴 보겠습니다. 

1. If - Elif (- Else)

import random


score = 90
attendance = 'great'

if score >= 90 and attendance =='great':
    print("your score is A+")
elif score >= 90 and attendance !='great':
    print("your score is A-")
elif score >= 80 and attendance =='great':
    print("your score is B+")
else:
    print("your score is C")

your score is A+


위는 Score와 Attendance로 성적을 판별하는 간단한 프로그램입니다.

설명과 함께 간단하게 코드를 알아 보겠습니다. If의 조건문: Score >=90 그리고(and) 출석 great || If의 코드: A+를 출력하고, Elif1의 조건문 Score>=90 그리고(and) 출석이 great가 아님(!=) || Elif1의 코드: A-를 출력 Elif2의 조건문 Score>=80 그리고(and) 출석이 great || Elif1의 코드: B를 출력 Else C를 출력


이는 중복 If 를 이용해서도 비슷하게 구현 될 수 있는데 자세한 코드를 보면 다음과 같습니다. 


2. 중복 If

if score >= 90:
    grade = 'A'
    if attendance =="great":
        grade_plus = grade + '+'
else:
    grade__plus = 'B'
grade_plus
Out[12]:
'A+'

간단하게 If - elif로 구현 할 수 있는 걸 굳이 중복 if문으로 구현 했으니 변수가 늘어나고 그런 걸 볼 수 있지만 지금은 그런 것보다, 중복 if문을 이해하는데 의의를 두면

좋을 것 같습니다. 간단한 코드지만 line by line으로 해석을 해보면, 


if1 조건: 위애서 정의한 score가 90이상 || if1의 코드: if 실행 새로운 변수 grade에 A대입한 뒤, 다시 if2문 실행(중복 if문)

if2 조건: 위에서 정의한 attendance가 great || if2의 코드: grade_plus라는 변수 정의 한 후, grade 변수에 character형 '+' 추가

else: grade_plus에 B대입 


grade_plus 출력


if문에 대해서 간단하게 알아 보았으니 다음에는 제어문 중에서 반복문의 기초가 되는 While문에 대해서 알아보도록 하겠습니다. While문도 프로그래밍 상 여러모로 쓸모가 많은 구문이기 때문에 숙지하시기 바랍니다. 저도 포스팅 하면서 여러모로 배우는 점이 많네요 ㅎㅎ



from IPython.core.display import display, HTML
display(HTML("<style>.container{width:90%!important;}</style>"))

주피터 노트북 블로그에 맞기 정렬하기


https://versusall.tistory.com/entry/1-Tistory-%EA%B8%80%EC%93%B0%EA%B8%B0-tip



'머신러닝 > 기초 문법' 카테고리의 다른 글

7. While. Break, Continue  (0) 2019.02.10
6. IF 문  (0) 2019.02.09
넘파이 기초 - 배열 생성(1)  (0) 2019.01.31
넘파이 기초 - 색인과 슬라이싱 기초(2)  (1) 2019.01.31
5. 딕셔너리 심화 - (2)  (0) 2019.01.30

먼저 https://sites.google.com/site/gbrtools/home/software/bootice-portable/bootice-downloads

에서 최신 버전의 Bootice를 다운 받습니다. (원래는 중국 프로그램이지만 고맙게도 영어 프로그램으로 번역이 되어 있습니다.) 다운 받으면 32비트 버전과 64비트 버전이 나오는데, x64가 64비트 버전이고, x86이 32비트 버전인 건 아시죠? 자기 os에 맞게 실행해 줍시다.

1. Grub삭제 또는 UEFI 삭제

ㅇㅇ아마 최근에 컴퓨터를 구매한 사람들은 UEFI삭제를 해야 할 것입니다. 먼저 Physical Disk탭에서 맨 아래에 Desination disk에서 C:w를 포함하고 있는 Disk를 선택해 줍시다. 별달리 USB장치, 외장하드나 파티션을 나눠 놓지 않았다면 하나만 뜰 것입니다. 그렇지 않으면 선택해야 겠죠.

 

2. Master Boot Record

 

- 여기서 분기가 갈립니다.

2.1 Current MBR type이 GRUB로 나올 수도 있고 Unknown MBR로 나올 수도 있는데, (제 경우에는 노트북 하나는 Unkown MBR로 나오고 데스크탑은 GRUB로 나왔었습니다)

2.2 GRUB의 경우, Available ABR Type에서 Windows NT 5.x/6.x를 선택 -> Install config를 선택

2.3. Choose MBR창이 나오면 Windows NT 5.x MBR 선택

2.4. Succesfully changed 확인

2.5. Close > 완료

 

3. Unkwon MBR의 경우

- 찌꺼기가 남을 수 있어서 명령어 창에서 뭐찾고 뭐라뭐라 치고 확인해야 하야 한다고 하는데 저는 남지 않았습니다. 찌꺼기는 남는 경우 해결하는 방법은 링크 합니다. https://jimnong.tistory.com/677

3.1. Physical tab닫고 UEFI 탭으로 이동(3개 옆인가 그랬습니다)

3.2. Edit boot entries 선택

3.3. UEFI boot entries에서 ubntu를 선택하고 있는지 확인

3.4. [Del]버튼을 눌러 UEFI Grub삭제

 

 

4. 해당 작업들 실행한 다음, 우분투에 할당 되어 있던 파티션들을 제거하고 윈도우에 다시 할당해 줘야 합니다. 쉬운 작업이니 모두 아시리라 믿지만

4.1. 윈도우 키 + R

4.2. 우분투에 할당 되어 있던 파티션(용량을 기억하거나 OEM 파티션을 제외한 파티션들을 제거)

4.3. C드라이브에서 파티션을 확장

 

 

 

 

윈도우 OS가 대부분인 이 세상에, (제 데스크탑도 다 윈도우임.) 우분투에서 머신러닝 관련 작업을 다 하기 때문에 우분투에 크롬 원격 데스크톱을 설치하면 좋겠다고 생각을 했습니다. 그리고 구글링을 한 결과 바로 나오긴 하더군요. 구글 원격 데스크톱을 설치하는 방법이 말입니다. 하지만 윈도우처럼 간단하지는 않았습니다. 당연히 일단 우분투가 명령어 기반이니까 그렇겠죠. 저도 좀 짜증날 때가 있습니다. 뭐 하나 설치하려면 다 검색해야 하고 -_-

 

 - 참고로 18.04와 16.04모두 동일한 듯 합니다. 제가 16.04방법보고 설치 했으니까요.

 

일단 먼저 크롬을 설치 해야겠죠. 그럼 크롬을 다운 받습니다. 우분투는 .deb인 거 다 아시죠? 모르시면 지금부터 알아 두시면 좋습니다. 기본적으로 우분투에서 뭐 다운 받으려고 하면 ..deb로 안내를 해 주긴 하지만 불친절한 사이트는 그렇지 않기도 하기 떄문에 확인을 하고 다운 받으시면 좋죠.

 

그럼 Downloadsv폴더로 가서

 

1. cd./Downloads

 

종속성을 가지는 패키지들을 모두 설치합니다.

 

sudo apt-get install ca-certificates

sudo apt-get install libappindicator1

 

dpkg -i 명령어는 파일 이름을 쓰셔야 하는 거 아실 겁니다. 압축을 풀고, 파일을 실행하는 거니까요. 만약 이런 패키지들이 모두 설치 되어 있다면, 설치 할 내용이 없다고 나올 것이고 설치 할 것이 있다면 설치해야 하고, Y/N을 입력하라고 나올 것입니다. 당연히 Y를 눌러서 설치를 진행합시다.

2. 크롬의 압축을 풀고 설치
sudo dpkg -i google-chrome-stable_current_amd64.deb
(크롬 설치 완료
3. XFCE4 설치
sudo apt-get install xfce4

4. 크롬 원격 데스크톱 설치(2019-06-26 수정: 이 앱은 더 이상 지원되지 않습니다. Chrome 원격 데스크톱 웹 앱을 사용하시기 바랍니다.라고 뜹니다. 구글이 윈도우나 우분투에서 지원을 안 하는 것 같습니다.)

- sudo dpkg -i chrome -i chrome-remote-desktop_current_amd64.deb

- 그리고 크롬 웹스토어에서 크롬 원격 데스크톱 다운로드

 

 

5. Home폴더에 가서 메모장으로 .chrome-remote-desktop-session을 만듭니다. 그리고 내용으로 startxfce4 를 적어 줍니다. 

 

6. 크롬 원격 데스크톱 클릭. 비번 지정하고 원격 접속하면 XFCE4화면으로 접속 할 수 있다. (Windows랑 달리 같이 조종 하는 게 아님.) 
import numpy as np import random 
In [18]:
list_data1 = [1,2,3,4] 
In [22]:
list_data1 
Out[22]:
[1, 2, 3, 4]

list를 ndarray로 변환하는 간단한 메서드를 생성합니다.

In [20]:
nd_list_data1 = np.array(list_data1) #array - 순차형 데이터를 ndarray로 변환 
In [21]:
nd_list_data1 
Out[21]:
array([1, 2, 3, 4])

기존에 python 리스트는 그냥 []로 나왔지만 ndarray의 경우 array[]로 나왔습니다.

In [24]:
nd_list_data1.ndim #1차원인 경우 열을 먼저 출력해 줌...? 
Out[24]:
1

차원을 출력하는 메서드는 .ndim이고

In [25]:
nd_list_data1.shape 
Out[25]:
(4,)

 

ndarray의 형태를 출력하는 방법은 .shape입니다. 자주 사용하고 직관적이기 때문에

외워 두시면 좋을 것 같습니다. 참고로 list에는 없는 메서드이기 때문에 참고해 두시면 좋을 것 같습니다.

In [27]:
nd_list_data1.dtype 
Out[27]:
dtype('int64')
In [29]:
zero = np.zeros(2) 
In [30]:
zero 
Out[30]:
array([0., 0.])
In [46]:
zero = np.zeros((3,6)) #내용을 0으로 채워서 ndarray 생성 
In [47]:
zero 
Out[47]:
array([[0., 0., 0., 0., 0., 0.],        [0., 0., 0., 0., 0., 0.],        [0., 0., 0., 0., 0., 0.]])

zeros()는 0으로 초기화된 ndarray를 생성합니다.

In [48]:
zero.shape 
Out[48]:
(3, 6)
In [49]:
np.empty((2,3,2)) #초기화되지 않고 채워진 배열을 반환 
Out[49]:
array([[[6.73898103e+149, 5.30276956e+180],         [3.31033942e-033, 6.97532527e-076],         [4.46234816e-086, 3.36010587e-143]],         [[6.01433264e+175, 6.93885958e+218],         [5.56218858e+180, 3.94356143e+180],         [5.64124820e-038, 9.96020951e-047]]])

empty(층, 행, 열) 메서드는 아무 값이나 랜덤으로 채운 채뤄 배열을 반환.

In [50]:
np.eye(3,3) #희박 행렬 생성.  
Out[50]:
array([[1., 0., 0.],        [0., 1., 0.],        [0., 0., 1.]])

eye는 희박 행렬을 생성하는데, 선형대수에서 많이 사용하는데 저는 선형 대수를 하지 않지만

선형 대수를 하시는 분은 eye 메서드를 그냥 외워 두시면 좋을 것 같습니다.

In [51]:
np.arange(5) #파이썬의 range와 유사. ndarray를 반환.  
Out[51]:
array([0, 1, 2, 3, 4])
In [ ]:
 

                              arange는 range랑 비슷하게, 0 ~ n 까지의 숫자를 생성하기 때문에 초기화를 할 때 잘 쓰는 함수입니다. 

   또는 그래프를 그릴 때 index를 사용 할 수 있겠죠.   

'머신러닝 > 기초 문법' 카테고리의 다른 글

6. IF 문  (0) 2019.02.09
주피터 노트북 블로그에 맞기 정렬하기  (0) 2019.02.08
넘파이 기초 - 색인과 슬라이싱 기초(2)  (1) 2019.01.31
5. 딕셔너리 심화 - (2)  (0) 2019.01.30
5. 딕셔너리 기초 - (1)  (0) 2019.01.29

 

 원래 넘파이랑 판다스는 파이썬을 완전히 끝낸 다음에 포스팅 하려고 했는데 간단한 부분 - (인덱싱이랑 슬라이싱) - 은 먼저 포스팅 하도록 하겠습니다. 코딩은 iPython이 아닌 jupyter notebook에서 작성 했음을 미리 알립니다. 주피터 노트북의 경우 딱 포스트 부분에 맞게 조절하는 방법이 있는 거 같은데 왜 전 안 될 까요ㅠㅠ 아무튼 안 되면 안 되는대로, 딱히 칸을 넘어가는 부분도 없으니까 일단 포스팅 하도록 하겠습니다. 

 

1. 1차원 배열 인덱싱

import numpy as nd

In [2]:

arr = np.arange(10)

In [3]:
arr 
Out[3]:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

arange메소드는 설명하지 않았지만 파이썬의 리스트에서 range메서드와

비슷한 역할을 합니다. 따라서 주로 초기화 하는데 저는 사용합니다. 그 외에는 거의 사용하는

적이 없는 것 같습니다.

In [4]:
arr[5] 
Out[4]:
5
In [5]:
arr[5:8] 
Out[5]:
array([5, 6, 7])

1차원 ndarray는 list와 거의 동일하게 동작합니다. 그냥 이 부분에 사용 할 수 있는 메서드가

다르다는 점만 있죠. 주로 많이 사용하는 2차원 ndarray에서 부터 주의가 많이 필요합니다.

In [6]:
arr[5:8] = 12 #색인 영역에 대입한 값이 전파된다. - 브로드캐스팅 
In [7]:
arr 
Out[7]:
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])

위와 같이 값을 전파 시키는 것을 브로드 캐스팅이라고 합니다. 색인 영역을 잘라서 (슬라이싱) 해서 값을 대입한 후,

이 값을 : 이 후부터 전파시키기 때문에 브로드 캐스팅이라고 합니다.

In [8]:
arr[5:8] 
Out[8]:
array([12, 12, 12])
In [9]:
arr_slice = arr[5:8] 
In [10]:
arr_slice[1]=12345 
In [11]:
arr 
Out[11]:
array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,            9])
In [12]:
arr_slice 
Out[12]:
array([   12, 12345,    12])

이 경우  arr_slice의 처음 값이 [5], 그리고 2번째 index인 arr_slice[1]값이 전체 arr[6]이기 때문에 12345가 대입이 됩니다. 

1차원 ndarray는 위에서 언급했다시피 list와 비슷하기 때문에 많이 공부 할 필요가 없지만 2차원 이후로부터 좀 공부를 해야하죠. 

 

이제 살펴보도록 합시다.

2. 2/3차원 배열 인덱싱 

 

arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]]) 
In [15]:
arr2d[1] #2차원 배열에서 단순한 색인 값은 스칼라 값이 아니라 1차원 배열이 된다.  
Out[15]:
array([4, 5, 6])

2차원 ndarray를 생성 하였는데, [123],[4,5,6],[7,8,9] 배열을 하나 더 둘러 싸고 있는

그림입니다. 따라서 1번 index는 [4,5,6]전체 배열이 되겠죠?

In [16]:
#개별 스칼라 요소에 접근 할 때는 [][] 처럼 콤마로 구분 된 색인 리스트로 접근 해야 한다 arr2d[1][0] 
Out[16]:
4

반면에 스칼라 값 하나에 접근 하려면 어느 배열의, 어느 열에 속하는지, 지정 해야합니다.

만약에, 2행[2] 0열[0]이면 arr2d[2][0] 즉, 7을 출력하게 되겠습니다.

In [17]:
arr3d = np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]]) # 3차원 배열의 경우 잘 시용되지 않지만 층,행,열 로 접근 됨 
In [18]:
arr3d[0] #0층 
Out[18]:
array([[1, 2, 3],        [4, 5, 6]])

해당 배열은 0층과 1층으로 나뉘어져 있는데 맨 앞에 있는 것이 층, 그 다음이 행, 그리고 마지막이 열로서,

index로 접근 할 때도 층,행,열로 접근 하면 됩니다. 다음을 살펴 볼까요?

In [19]:
arr3d[1] #1층 
Out[19]:
array([[ 7,  8,  9],        [10, 11, 12]])

 

1층이기 때문에 위와 같이 출력해 줍니다. 반면에 2층은 존재 하지 않기 때문에 index가 존재하지 않는다고

에러 메세지를 출력하는군요. 바람직 합니다.

In [20]:
arr3d[2] #2층 없음 
 
--------------------------------------------------------------------------- IndexError                                Traceback (most recent call last) <ipython-input-20-f1c4238f3db7> in <module> ----> 1 arr3d[2] #2층 없음  IndexError: index 2 is out of bounds for axis 0 with size 2
In [ ]:
arr3d[0]=42 
In [21]:
old_values = arr3d[0].copy() 
In [22]:
arr3d[0]=42 
In [23]:
arr3d 
Out[23]:
array([[[42, 42, 42],         [42, 42, 42]],         [[ 7,  8,  9],         [10, 11, 12]]])

값을 대입 해 봤습니다. 0층에 42 값을 대입했고,

나중에 다시 값을 바꾸기 위해 old_values에 이전에 있던 값들을 복사 해 놨습니다.

In [24]:
arr3d[0]=old_values 
In [25]:
arr3d 
Out[25]:
array([[[ 1,  2,  3],         [ 4,  5,  6]],         [[ 7,  8,  9],         [10, 11, 12]]])

다시 old_values를 0층에 넣었더니 값이 원래대로 변했습니다.

In [26]:
arr3d[1,0] # -> 1층에, 0행 , 열 생략한 상태 
Out[26]:
array([7, 8, 9])

 

3차원 배열의 index가 어떻게 사용되는 지 알아보기 위해서(층,행,열)직접 코딩을 해 봤습니다.

1층, 0행 이니까, (열은 쓰지 않았음)

[7,8,9],

[10,11,12].

중에서

 

[7,8,9]열을 고를 것 같습니다.

 

예상대로 위에서는 해당 열을 골랐습니다. 그럼 이번에는 열을 골라 봅시다.

In [27]:
arr3d[1,1,1] # -> 1층, 1행, 1열 
Out[27]:
11

1층이므로, 
[7,8,9]
[10,11,12]
1행이므로
[10,11,12]
1열이므로

11을 출력 할 것입니다.

 

헷갈리신다면 다시 한 번 보시면 이해가 가실 겁니다. 별로 어렵지 않은 부분이니까요.

 

 

3. 색인과 슬라이싱 기초 / 슬라이스 색인

 

#--------------------슬라이스 색인----------------------# 
In [29]:
arr2d 
Out[29]:
array([[1, 2, 3],        [4, 5, 6],        [7, 8, 9]])
In [30]:
arr3d 
Out[30]:
array([[[ 1,  2,  3],         [ 4,  5,  6]],         [[ 7,  8,  9],         [10, 11, 12]]])
In [31]:
arr2d[:2] #2행까지 슬라이싱 
Out[31]:
array([[1, 2, 3],        [4, 5, 6]])

2차원 ndarray도 1차원 ndarray를 조금 확장 해서 생각해 보시면 됩니다.

층, 행, 열이라고 했는데, 2darray에는 층이라는 게 존재하지 않으므로 신경 쓸 필요가 없습니다.

행을 슬라이스 , 즉, 2행 이상을 모두 잘라서 보여주는 거라고 생각 하시면 됩니다.

In [32]:
arr2d[:2,1:] #2행까지 슬라이싱 하고, 1열이후로 슬라이싱 
Out[32]:
array([[2, 3],        [5, 6]])

뒤에 열이 붙긴 했지만 2행 위를 자르고, 1행 다음으로 자른 슬라이싱을 출력합니다.

위에 슬라이싱 개념을 생각해 보시고 조금 확장 해서 생각해 보시면 될 것 같습니다.

In [33]:
arr2d[1,:2] #arr2d[1,] 이렇게 사용하는 것을 정수 색인이라고 한다. 나중에 다르게 사용되는 것도 있으니 알아두도록 한다.  
Out[33]:
array([4, 5])

해당 1: 이나 :1 이 아닌 1이라고 쓰는 것을 정수 색인이라고 합니다.

나중에 판다스랑 조금 다르게 사용되는 부분이 있으므로 기억해 두시기 바랍니다.

이 부분은 정확히 1행에, [4,5,6] 2열 아래로 자르므로 [4,5]행을 출력합니다.

In [34]:
arr2d[:,:1] #:만 사용하면 전체 축(모든 행 또는 모든 열)을 의미한다. 따라서 원래 차원의 슬라이스를 얻을 수 있다.  
Out[34]:
array([[1],        [4],        [7]])

마지막으로 전체 행을 뜻하는 : 을 알아 봅시다. : 전체 행에서 , :1 1열 전을 얘기하므로,

[1]

[4]

[7]

열만 출력합니다.

 

 

넘파이에는 슬라이스 색인 이외에도 불리언 색인과 팬시 색인이라는 중요한 개념이 있는데 이 부분은 좀 더 공부를 하고 포스팅을 할 예정입니다. 그 이전까지는 파이썬에 집중 해야죠. 그럼 오늘 포스팅은 여기까지 하고 마치도록 하겠습니다. 
 
 
 
 
 
 

 

+ Recent posts