no image
[Python] 가상환경 생성과 삭제, 활성화 및 비활성화(MacOS, Windows)
Window와 MacOS 환경에서 가상환경을 생성하고 활성화 및 비활성화하는 방법에 대해 소개해드리려고 합니다. 가상환경 생성 처음에 가상환경을 생성합니다. MacOS # python3 -m venv ./"생성하려는 가상환경 이름" $ python3 -m venv ./venv Windows # python -m venv "생성하려는 가상환경 이름" >python -m venv venv 가상환경 활성화 가상환경을 활성화합니다. MacOS # source "생성한 가상환경 이름"/bin/activate $ source venv/bin/activate Windows # cd "생성한 가상환경 이름"/Scripts >cd venv/Scripts >activate 가상환경 비활성화 가상환경을 비활성화하는 명령어는..
2023.12.27
no image
[Numpy] 배열 이어붙이기 (concatenate, vstack, hstack, r_, c_)
np.concatnate numpy.concatenate((a1, a2, ...), axis=0)를 써서 사용합니다. 여기서 axis=0 행이고 axis=1 열입니다. axis=0이면 열에다가 concat axis=1이면 행에다가 concat axis에 대해 매개변수가 없으면 1차원으로 concat합니다. 그림으로 예시를 보여드리겠습니다. 각각 (2,3)의 a와 b의 배열이 있습니다. 두개의 배열에 대해 사용하는 예시를 보여드리겠습니다. 배열 선언 >>> import numpy as np >>> a = np.array([[1,2,3],[4,5,6]]) >>> a array([[1, 2, 3], [4, 5, 6]]) >>> b = np.array([[7,8,9],[10,11,12]]) >>> b array..
2023.12.26
no image
[OpenAI] platform.openai.com 가입 및 카드 등록하는 방법
오늘은 OpenAI에서 Playground 프롬프트 조작을 위해 Platform.openai.com에 가입하는 방법을 소개해드릴려고 합니다. https://platform.openai.com/ 클릭해서 여기에 접속합니다. 가입을 위해 Sign up버튼을 클릭합니다. 여기서 원하는 계정으로 가입을 합니다. 이제 카드 등록을 할 것입니다. 카드 등록을 위해 Settings 탭을 클릭합니다. Setting탭 클릭 후 Billing 탭을 클릭합니다. Add to credit balance 버튼을 클릭합니다. 저는 개인이기에 Individual을 선택하겠습니다. 그러면 이제 영어주소와 카드 번호를 입력하는 칸이 나옵니다. 여기서 카드는 VISA, MASTER 카드등이 해외결제가 가능하기에 그 카드로 등록하셔야합니..
2023.12.25
no image
[일기] 레오폴드 FC900R PD 적축 청소(기계식 키보드 청소)
오늘은 본가에 내려와서 뭘 할까 고민하다가 고등학교 때 사고 한번도 청소 안해본 키보드를 청소하고 싶어서 갑자기 키보드를 청소하게 되었습니다. 처음에 외관 키보드를 찍지 못한게 청소하다보니 블로그에 올리고 싶어져서 급하게 사진을 찍었습니다.. 일단 청소 다 된 키보드부터 보여드리겠습니다. 자 본론으로 돌아가서.. 다들 조심하세요 약 4년 넘게 청소 안한 키보드라 상당히 더럽더라구요,,, 상하판을 분리했습니다. 상하판 분리하는 방법은 뒤의 나사 3개를 풀고 틈사이에 카드를 집어넣어 뺐습니다. 자세한건 다른 블로그 글을 찾아보세요 ㅠㅠ.. 집에 적당한 클리너가 없어서 액정클리너 이용해서 키보드 키캡을 모조리 닦아줬습니다. 그리고 상, 하판도 열심히 청소했습니다. 먼지가 좀 껴보이는데 진자 빡빡 닦았는데 기스..
2023.12.25
no image
[일기] 연말정산
일기를 쓴 지 반년이 넘어서 뭐 했는지 정리할 겸 적어봅니다. 반년동안 정말 많은 일이 있었네요. 제가 한화팬인데 정말 오래살고 볼일이네요 기사는 5연승이었지만, 총 8연승인가 9 연승해서 십몇년만인지... 정말 야구 진심으로 봤었는데 결국엔 9등을 했지만 그래도 여름을 야구 덕분에 정말 재밌었습니다. 그러다가 학교에서 코엑스를 보내줘서 여러가지 체험도 하고 별마당 도서관도 갔습니다. 서울 가서 술도 먹었습니다. 저 때 술을 너무 많이 먹어서 정신 못차리다가 학교 와서 정신을 차렸네요 맛있긴 했는데 기억이 가물가물하네요.. 그러다가 어느날은 후배들과 술을 먹는데 역할맥에서 4명이서 13만 원 쓰고 거기다가 전집까지 해서 도합 20만 원 가까이 썼네요. 진짜.. 그리고 여름이라 동해, 서해, 남해 다 갔네..
2023.12.23
no image
[Numpy] 팬시 색인(fancy indexing)
팬시 색인( fancy indexing)이란? 정수 배열을 사용한 색인을 설명하기 위해 Numpy에서 차용한 단어이다. 팬시 색인은 슬라이싱과 달리 선택된 데이터를 새로운 배열로 복사한다. 값을 가져오는 것이 아닌 값을 복사하는 것이다. 팬시 색인 예시 특정한 순서로 행을 선택하고 싶다면 원하는 순서가 명시된 정수가 담긴 ndarray 또는 list를 매개변수로 입력한다. 1차원 배열로 팬시색인을 하는 경우 >>> import numpy as np >>> arr = np.zeros((8,4)) >>> for i in range(8): ... arr[i] = i >>> arr array([[0., 0., 0., 0.], [1., 1., 1., 1.], [2., 2., 2., 2.], [3., 3., 3.,..
2023.12.22
no image
[Numpy] Numpy 메서드 ( argmin, argmax, cumsum, cumprod)
파이썬의 통계를 위한 메서드 배열 전체 혹은 배열의 한 축에 속하는 자료에서 통계를 계산하는 수학 함수 중 4개를 소개한다. argmax : 최대 원소의 인덱스값 argmin : 최소 원소의 인덱스값 cumsum : 0부터 시작하는 각 원소의 누적 합 cumprod : 1부터 시작하는 각 원소의 누적 곱 4개의 함수는 모두 axis라는 매개변수를 갖는다. (2차원 기준으로 설명) axis = 0 : 행을 의미하며, 계산은 행의 방향대로 진행 aixs = 1 : 열을 의미하며, 계산은 열의 방향대로 진행 np.argmin np.argmax(data, axis(default=0)) : 최대 원소의 인덱스 값 반환 >>> import numpy as np >>> data = np.array([[0,3,5],[..
2023.12.21
no image
[Numpy] Numpy란? (ndarray, ndim, shape)
Numpy란? Numerical Python의 준말인 넘파이$^{Numpy}$는 파이썬에서 산술 연산, 수치해석과 같은 수학 및 과학 연산을 위한 파이썬 패키지이다. 다차원 배열을 쉽고 효율적으로 처리하며 Pandas와 연동하여 자주 사용한다. 핵심 기능은 ndarray라고 하는 N차원의 객체 배열이다. 왜 사용하는가? 파이썬의 기본 라이브러리보다 매우 매우 빠르고 효율적이다, 배열 내부의 원소의 값들을 브로드캐스팅할 때, 파이썬은 반복문을 사용하지만, 넘파이는 한 번에 가능하기에 빠르다. Numpy 설치 $ pip install numpy ndarray, 다차원 배열 객체 생성 가장 기본적으로 생성하는 방법 >>> import numpy as np >>> data =np.array([[1.5, -0.1..
2023.12.20
no image
[Python] for else구문과 while else구문 정리
for-else구문 else구문이 실행된 경우 for구문 내부의 break를 실행되지 않고, for구문이 종료된 경우 else구문을 실행합니다. for i in range(1,5): if i == 5: break print(i) else: print("break 실행되지 않았으며, else가 실행되었음") # 실행결과 # 1 # 2 # 3 # 4 # break 실행되지 않았으며, else가 실행되었음 else구문이 실행되지 않은경우 for구문 내부의 break를 실행되었으며, else구문이 실행되지 않습니다. for i in range(1,5): if i == 3: break print(i) else: print("break 실행되지 않았으며, else가 실행되었음") # 실행결과 # 1 # 2 whil..
2023.11.30
no image
[BOJ] [Python] 1107번: 리모컨
문제 수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장 났다. 리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고 있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대만큼 있다. 수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장 났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오. 수빈이가 지금 보고 있는 채널은 100번이다. 입력 더보기 첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장..
2023.11.30
728x90

Window와 MacOS 환경에서 가상환경을 생성하고 활성화 및 비활성화하는 방법에 대해 소개해드리려고 합니다.

 

가상환경 생성


처음에 가상환경을 생성합니다.

MacOS

# python3 -m venv ./"생성하려는 가상환경 이름"
$ python3 -m venv ./venv

 

Windows

# python -m venv "생성하려는 가상환경 이름"
>python -m venv venv

 

가상환경 활성화


가상환경을 활성화합니다.

MacOS

# source "생성한 가상환경 이름"/bin/activate
$ source venv/bin/activate

가상환경을 실행하면 좌측의 (venv)와 같이 실행되는 것을 볼 수 있습니다.

Windows

# cd "생성한 가상환경 이름"/Scripts
>cd venv/Scripts
>activate

 

가상환경 비활성화


가상환경을 비활성화하는 명령어는 MacOS와 Windows 동일합니다.

$ deactivate

(venv)가 사라진 것을 볼 수 있습니다.

 

가상환경 삭제


가상환경을 삭제하는 방법은 폴더를 삭제하면 됩니다. 

MacOS

# venv라는 폴더를 삭제하는 명령어
$ rm -r venv

 

다음과 같이 venv 폴더를 삭제합니다.

Windows

# rmdir /s "생성한 가상환경 이름"
>rmdir /s venv

다음과 같이 venv 폴더를 삭제합니다.

728x90
728x90

np.concatnate


numpy.concatenate((a1, a2, ...), axis=0)를 써서 사용합니다. 여기서 axis=0 행이고 axis=1 열입니다.

  • axis=0이면 열에다가 concat
  • axis=1이면 행에다가 concat
  • axis에 대해 매개변수가 없으면 1차원으로 concat합니다.

 

그림으로 예시를 보여드리겠습니다.  각각 (2,3)의 a와 b의 배열이 있습니다. 두개의 배열에 대해 사용하는 예시를 보여드리겠습니다.

배열 선언

>>> import numpy as np
>>> a = np.array([[1,2,3],[4,5,6]])
>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b = np.array([[7,8,9],[10,11,12]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])

 

 

np.concatenate((a, b), axis = None)


None을 입력하면 a와 b의 배열이 1차원으로 펼쳐진다고 생각하면 됩니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])

>>> np.concatenate((a,b),axis=None)
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])

 

 

np.concatenate((a, b), axis = 0) , np.concatenate((a, b)), np.vstack((a, b))


세 개의 함수는 동일한 결과를 출력합니다. axis=0일 때, 행을 기준으로 concat, stack하게 됩니다. 자세한 것은 밑의 그림에 나와있습니다.

axis = 0 을 기준으로 a와 b의 배열이 합쳐지는 것을 볼 수 있습니다. vstack에서 v는 vertically를 의미하며 수직으로 쌓인다는 것을 말합니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.concatenate((a,b))
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
>>> np.concatenate((a,b), axis=0)
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
       # vstack도 동일한 결과 반환
>>> np.vstack((a,b))
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

 

 

np.concatenate((a, b), axis=1), np.hstack((a, b))


두 개의 함수는 동일한 결과를 출력합니다. axis=1일 때, 열을 기준으로 concat, stack하게 됩니다. 자세한 것은 밑의 그림에 나와있습니다.

axis = 1 을 기준으로 a와 b의 배열이 합쳐지는 것을 볼 수 있습니다.hstack에서 h는 horizontally를 의미하며 수평으로 쌓인다는 것을 말합니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.concatenate((a,b), axis=1)
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])
>>> np.hstack((a,b))
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])

 

 

추가적으로  r_와 c_에 대해서 설명해보겠습니다.

np.r_[a, b]


r_는 np.concatenate((a,b)),  np.vstack((a, b))와 동일하다고 보시면 됩니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])

>>> np.r_[a,b]
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

 

np.c_[a, b]


c_는 np.concatenate((a,b), axis = 1),  np.hstack((a, b))와 동일하다고 보시면 됩니다.

>>> a
array([[1, 2, 3],
       [4, 5, 6]])
       
>>> b
array([[ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.c_[a,b]
array([[ 1,  2,  3,  7,  8,  9],
       [ 4,  5,  6, 10, 11, 12]])

 

출처 : https://numpy.org/doc/stable/reference/generated/numpy.concatenate.html

 

728x90
728x90

 

오늘은 OpenAI에서 Playground 프롬프트 조작을 위해 Platform.openai.com에 가입하는 방법을 소개해드릴려고 합니다. 

https://platform.openai.com/

클릭해서 여기에 접속합니다. 가입을 위해 Sign up버튼을 클릭합니다.

여기서 원하는 계정으로 가입을 합니다.

저는 네이버로 했습니다.

 

이제 카드 등록을 할 것입니다.  카드 등록을 위해 Settings 탭을 클릭합니다.

Settings 탭 클릭

 

Setting탭 클릭 후 Billing 탭을 클릭합니다.

Billing 탭 클릭

 

Add to credit balance 버튼을 클릭합니다.

Add to credit balance 버튼 클릭

 

저는 개인이기에 Individual을 선택하겠습니다.

 

그러면 이제 영어주소와 카드 번호를 입력하는 칸이 나옵니다. 여기서 카드는 VISA, MASTER 카드등이 해외결제가 가능하기에 그 카드로 등록하셔야합니다.

 

카드안에 그림이 포함

 

카드번호와 유효기간, CVC 코드를 입력합니다. 

영어주소를 모르면 ⭐여기⭐를 클릭하셔서 입력하시면 됩니다.

 

 

카드가 등록되었으면 Billing settings 탭에 Payment methods에 들어가시면 다음과 같이 카드가 등록되어있는 것을 볼 수 있습니다.

 

 

마지막으로  Add to credit balance 클릭 후, 결제할 금액을 선택해서 결제하시면 됩니다.

9.84달러는 이미 제가 사용해서 남은 금액입니다.

원하는 달러만큼 입력하고 결제하시면 됩니다.

 

다음엔 Playground 사용법에 대해 설명하도록 하겠습니다.

728x90

'AI API > OpenAI' 카테고리의 다른 글

[OpenAI] Playground 사용법 (GPT로 Prompt Engineering 해보기)  (0) 2023.12.30
728x90

오늘은 본가에 내려와서 뭘 할까 고민하다가 고등학교 때 사고 한번도 청소 안해본 키보드를 청소하고 싶어서 갑자기 키보드를 청소하게 되었습니다.

처음에 외관 키보드를 찍지 못한게 청소하다보니 블로그에 올리고 싶어져서 급하게 사진을 찍었습니다..

일단 청소 다 된 키보드부터 보여드리겠습니다.

뭐야 왜 누끼따졌어...

 

 

자 본론으로 돌아가서.. 다들 조심하세요 약 4년 넘게 청소 안한 키보드라 상당히 더럽더라구요,,,  

진짜 더럽네요..

 

상하판을 분리했습니다.

상하판 분리하는 방법은 뒤의 나사 3개를 풀고 틈사이에 카드를 집어넣어 뺐습니다. 자세한건 다른 블로그 글을 찾아보세요 ㅠㅠ..

키캡이랑 상,하판 분리

 

집에 적당한 클리너가 없어서 액정클리너 이용해서 키보드 키캡을 모조리 닦아줬습니다.

 

그리고 상, 하판도 열심히 청소했습니다. 먼지가 좀 껴보이는데 진자 빡빡 닦았는데 기스때문에 닦아도 더러워 보이네요,,

키보드 배열이 이상하다고요? 네 막 집어 넣습니다.

이렇게 저렇게 조립해서 깨끗한 키보드를 완성했습니다. 

약 5년만에 키보드 청소했습니다. 진짜 속이 시원하네요 

728x90

'기타 > 일상' 카테고리의 다른 글

[일기] 연말정산  (0) 2023.12.23
[일기] 나는 블로그를 안하는 2.5년 동안 무엇을 했는가  (0) 2023.06.20

[일기] 연말정산

Giliit
|2023. 12. 23. 14:21
728x90

일기를 쓴 지 반년이 넘어서 뭐 했는지 정리할 겸 적어봅니다. 반년동안 정말 많은 일이 있었네요. 

이게 무슨일이야...

제가 한화팬인데 정말 오래살고 볼일이네요 기사는 5연승이었지만, 총 8연승인가 9 연승해서 십몇년만인지... 정말 야구 진심으로 봤었는데 결국엔 9등을 했지만 그래도 여름을 야구 덕분에 정말 재밌었습니다.

그러다가 학교에서 코엑스를 보내줘서 여러가지 체험도 하고 별마당 도서관도 갔습니다. 서울 가서 술도 먹었습니다.

저 때 술을 너무 많이 먹어서 정신 못차리다가 학교 와서 정신을 차렸네요 맛있긴 했는데 기억이 가물가물하네요..

그러다가 어느날은 후배들과 술을 먹는데 역할맥에서 4명이서 13만 원 쓰고 거기다가 전집까지 해서 도합 20만 원 가까이 썼네요. 진짜..

저거 합쳐서 20만원..

 

그리고 여름이라 동해, 서해, 남해 다 갔네요. 덕분에 진짜 재밌게 놀았습니다. 맛있는거 많이 먹고 배부르게 놀았습니다. 저랑 같이 여행 가주셔서 다들 감사합니다. (꾸벅)

어쩌다 보니 핫플레이스를 다 갔네

부산, 동해, 대천

 

집에서 요리도 했습니다. 근데 양 조절을 못해서 그냥 다 부어버리고 진행했습니다. 요리는 제가 가장 좋아하는 골뱅이 소면으로 했는데 진짜 배 터지게 먹었습니다.

면이 압도적으로 많네요.. 다음엔 계량해서 해야지..

 

대전으로 야구 보러도 갔습니다. 2일 연속으로 야구 볼 생각에 설레서 갔습니다. 근데 망할 놈의 날씨가 둘 다 우천취소를 만들었습니다. 사진은 야구를 볼 줄 알고 인증숏 찍었는데 네.... 못 봤습니다..

두 날은 다른날인데 둘다 우천취소당했네... 대전은 내년을 기약해야지

 

그리고 우천 당한 김에 그냥 술이나 먹었습니다. 둘이서 8병 먹고 그냥 생쇼를 다했습니다. 진짜 아오.... 제 폰 뺏어가서 그냥 별 사진을... ^^.

충청도 소주, 제주도소주로 몇병을 먹었는지..

 

 

 

술맛을 아는 동기 덕분에 다양한 술을 먹어봤네요. 아마 밑에 있는 술이 다 들어있을지도 모릅니다. 진짜 술을 맛으로 먹는 사람이라 덕분에 다양한 술을 먹어봤네요

 

송도 맥주축제도 갔습니다. 제 고향인 예산에서도 맥주 축제를 이것을 따라 한다고 해서 궁금해서 가보았습니다. 가서 사진도 하나 찍고 사람이 너무 많아서 한 번으로 충분할 것 같습니다. 

 

 

또 야구 보러 왔습니다. 개막전 이후에 오랜만에 오는데 이때 진짜 야구 오래 해서 너무 힘들었습니다. 근데 뭐랄까 대학교 사람들과 같이 오면 항상 이기니까 신기했습니다. 다음에도 가게 되면 좀 자주 데려가야겠습니다. 덕분에 직관 연패 탈출했습니다. 

12회말까지 보는데 10~ 11시 되었으니 거의 5시간 봤는데 너무 힘들었습니다. 진짜 이겼으니 다행이지..

 

그리고 연예인 사인 받았습니다.

근데 누가 싸인했지..?

 

 

 

29년 만에 LG 우승하는 것을 봤습니다. 한화도 빨리 우승했으면 좋겠네요. 29년 되기 전에 좀 우승해라...

진짜 우승하면 질질 짤 자신 있는데 우승을 못하니 아쉽네요...

(근데 그걸 네가 뭐 하러 봐)

 

3년 만에 코드 페스티벌 참가했습니다. 그래도 백준 많이 풀어서 잘할 줄 알았는데 입상도 못해서 좀 아쉬워서 이때부터 다시 코테 준비를 하기로 했습니다.

제 노트북은 아니고 제 앞자리 사람 컴퓨터입니다.

 

동기들이 상을 타와서 상금으로 맛있게 먹었습니다. 제가 조그마한 AI지식으로 첨삭했더니 많이 크게 돌아왔네요.. 사주셔서 감사합니다.

 

 

 

기숙사 창문 열어놨더니 온도가 무섭습니다. 다들 감기조심하세요

하루 열어놨다고 무슨 6도냐..

 

눈사람도 만들었습니다. 

맨손으로 만들다가 손 나가 떨어지는 줄 알았네요

 

마지막으로 제가 가장 좋아하는 술로 마무리하겠습니다.

합쳐서 약 3L... 일년동안 연태 3L를 지인들과 먹었네요,,,, 연태 짱

 

다들 연말 감기조심하세요... (-_-)

728x90
728x90

 

팬시 색인( fancy indexing)이란?


정수 배열을 사용한 색인을 설명하기 위해 Numpy에서 차용한 단어이다. 팬시 색인은 슬라이싱과 달리 선택된 데이터를 새로운 배열로 복사한다. 값을 가져오는 것이 아닌 값을 복사하는 것이다.

 

팬시 색인 예시


특정한 순서로 행을 선택하고 싶다면 원하는 순서가 명시된 정수가 담긴 ndarray 또는 list를 매개변수로 입력한다.

 

1차원 배열로 팬시색인을 하는 경우

>>> import numpy as np
>>> arr = np.zeros((8,4))
>>> for i in range(8):
... arr[i] = i
>>> arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

>>> arr[[4,3,0,6]]
array([[4., 4., 4., 4.],
       [3., 3., 3., 3.],
       [0., 0., 0., 0.],
       [6., 6., 6., 6.]])

 

2차원 배열로 팬시색인을 하는 경우

각 색인 튜플에 대응하는 1차원 배열이 선택된다.

>>> arr = np.arange(32).reshape((8,4))
>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
>>> arr[[1, 5, 7, 2],[0, 3, 1, 2]]
array([ 4, 23, 29, 10])

# (1,0), (5,3), (7,1), (2,2) 위치의 원소들이 선택됨

 

행렬의 행과 열에 대응하는 사각형 모양의 값으로 선택하는 방법

1. 해당하는 배열 추출

2. 추출된 배열 순서 변경

>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
       
>>> arr[[1,5,7,2]][:,[0,3,1,2]]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])

 

팬시 색인으로 값을 대입하는 경우, 색인된 값이 변경

>>> arr
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
>>> arr[[1,5,7,2],[0,3,1,2]] = 0

>>> arr
array([[ 0,  1,  2,  3],
       [ 0,  5,  6,  7],
       [ 8,  9,  0, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22,  0],
       [24, 25, 26, 27],
       [28,  0, 30, 31]])
728x90
728x90

파이썬의 통계를 위한 메서드

배열 전체 혹은 배열의 한 축에 속하는 자료에서 통계를 계산하는 수학 함수 중 4개를 소개한다.

  • argmax : 최대 원소의 인덱스값
  • argmin : 최소 원소의 인덱스값
  • cumsum : 0부터 시작하는 각 원소의 누적 합
  • cumprod : 1부터 시작하는 각 원소의 누적 곱

4개의 함수는 모두 axis라는 매개변수를 갖는다. (2차원 기준으로 설명)

  • axis = 0 : 행을 의미하며, 계산은 행의 방향대로 진행
  • aixs = 1 : 열을 의미하며, 계산은 열의 방향대로 진행

 

np.argmin


np.argmax(data, axis(default=0)) : 최대 원소의 인덱스 값 반환

>>> import numpy as np
>>> data = np.array([[0,3,5],[6,4,2]])
>>> np.argmax(data,axis=0)
array([1, 1, 0])

>>> np.argmax(data,axis=1)
array([2, 0])

 

 

np.argmin


np.argmin(data, axis(default=0)) : 최소 원소의 인덱스 값 반환

>>> import numpy as np
>>> data = np.array([[3,2,4], [1,3,2]])
>>> np.argmin(data, axis=0)
array([1, 0, 1])
>>> np.argmin(data, axis=1)
array([1, 0])

 

 

np.cumsum


np.cumsum(data, axis(default=0))0부터 시작하는 각 원소의 누적 합

>>> import numpy as np
>>> data = np.arange(1,13).reshape(4,3)
>>> data
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])
       
>>> np.cumsum(data, axis=0)
array([[ 1,  2,  3],
       [ 5,  7,  9],
       [12, 15, 18],
       [22, 26, 30]])
       
>>> np.cumsum(data, axis=1)
array([[ 1,  3,  6],
       [ 4,  9, 15],
       [ 7, 15, 24],
       [10, 21, 33]])

 

np.cumprod


np.cumprod(data, axis(default=0))1부터 시작하는 각 원소의 누적 곱

>>> import numpy as np
>>> data = np.arange(1,13).reshape(4,3)
>>> data
array([[ 1,  2,  3],
       [ 4,  5,  6],
       [ 7,  8,  9],
       [10, 11, 12]])

>>> np.cumprod(data, axis=0)
array([[   1,    2,    3],
       [   4,   10,   18],
       [  28,   80,  162],
       [ 280,  880, 1944]])
       
>>> np.cumprod(data, axis=1)
array([[   1,    2,    6],
       [   4,   20,  120],
       [   7,   56,  504],
       [  10,  110, 1320]])

 

728x90
728x90

Numpy란?


Numerical Python의 준말인 넘파이$^{Numpy}$는 파이썬에서 산술 연산, 수치해석과 같은 수학 및 과학 연산을 위한 파이썬 패키지이다. 다차원 배열을 쉽고 효율적으로 처리하며 Pandas와 연동하여 자주 사용한다. 핵심 기능은 ndarray라고 하는 N차원의 객체 배열이다. 

왜 사용하는가?

파이썬의 기본 라이브러리보다 매우 매우 빠르고 효율적이다

배열 내부의 원소의 값들을 브로드캐스팅할 때, 파이썬은 반복문을 사용하지만, 넘파이는 한 번에 가능하기에 빠르다.

 

Numpy 설치


$ pip install numpy

 

ndarray,  다차원 배열 객체 생성


가장 기본적으로 생성하는 방법

>>> import numpy as np
>>> data =np.array([[1.5, -0.1, 3], [0, -3, 6.5]])
>>> data
array([[ 1.5, -0.1,  3. ],
       [ 0. , -3. ,  6.5]])
       
>>> tmp = [1,2,3,4]
>>> data = np.array(tmp)
>>> data
array([1, 2, 3, 4])

 

 

np.array( 리스트, 튜플, 배열 또는 순차형 데이터)

위의 예시와 동일합니다.

 

np.arange(범위)

arrange는 파이썬의 range 함수의 배열 버전

>>> np.arange(15)
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

 

np.ones(배열의 크기)

배열의 원소가 1로 이루어진 배열의 크기를 반환

>>> np.ones((2,4))
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.]])

 

np.zeros(배열의 크기)

배열의 원소가 1으로 이루어진 배열의 크기를 반환

>>> np.zeros((5,3))
array([[0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.],
       [0., 0., 0.]])

 

np.full(배열의 크기, Value)

배열의 원소가 Value로 이루어진 배열의 크기를 반환

>>> np.full((2,2), 44)
array([[44, 44],
       [44, 44]])

 

np.eye(N)

N x N 배열로 이루어졌으며 대각선 원소의 값이 1인 배열을 반환

>>> np.eye(5)
array([[1., 0., 0., 0., 0.],
       [0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.]])

 

ndarray 차원과 모양


ndim과 shape

배열의 차원의 수와 모양을 확인하는 속성

>>> data = np.zeros((3,2,4))
>>> data.shape
(3, 2, 4)
>>> data.ndim
3

 

 

728x90
728x90

for-else구문


else구문이 실행된 경우

 

for구문 내부의 break를 실행되지 않고, for구문이 종료된 경우 else구문을 실행합니다.

for i in range(1,5):
    if i == 5:
        break
    print(i)
else:
    print("break 실행되지 않았으며, else가 실행되었음")

# 실행결과
# 1
# 2
# 3
# 4
# break 실행되지 않았으며, else가 실행되었음

 

else구문이 실행되지 않은경우

for구문 내부의 break를 실행되었으며, else구문이 실행되지 않습니다.

for i in range(1,5):
    if i == 3:
        break
    print(i)
else:
    print("break 실행되지 않았으며, else가 실행되었음")

# 실행결과
# 1
# 2

 

while-else구문


else문이 실행된 경우

while구문 내부의 break를 실행되지 않고 while구문이 종료되었을 경우

i = 1
while i < 5:
    print(i)
    if i == 5:
        break
    i += 1

else:
    print("break 실행되지 않았으며, else가 실행되었음")

# 실행결과
# 1
# 2
# 3
# 4 break 실행되지 않았으며, else가 실행되었음

 

else구문이 실행되지 않은경우

while구문 내부의 break를 실행되었으며, else구문이 실행되지 않습니다.

i = 1
while i < 5:
    print(i)
    if i == 3:
        break
    i += 1

else:
    print("break 실행되지 않았으며, else가 실행 되었음")

# 실행결과
# 1
# 2
# 3

 

 

언제, 왜 사용할까?

 

특정 조건이나, 특정 숫자를 찾을 때 유용합니다. List 내부에서 for문을 이용해서 특정 원소를 찾는 경우, 찾으려는 원소가 없으면 for문이 모두 실행되므로 else문을 실행합니다. 이러한 방식으로 while-else 또는 for-else를 사용할 수 있습니다.

728x90
728x90

 

문제


수빈이는 TV를 보고 있다. 수빈이는 채널을 돌리려고 했지만, 버튼을 너무 세게 누르는 바람에, 일부 숫자 버튼이 고장 났다.

리모컨에는 버튼이 0부터 9까지 숫자, +와 -가 있다. +를 누르면 현재 보고 있는 채널에서 +1된 채널로 이동하고, -를 누르면 -1된 채널로 이동한다. 채널 0에서 -를 누른 경우에는 채널이 변하지 않고, 채널은 무한대만큼 있다.

수빈이가 지금 이동하려고 하는 채널은 N이다. 어떤 버튼이 고장 났는지 주어졌을 때, 채널 N으로 이동하기 위해서 버튼을 최소 몇 번 눌러야 하는지 구하는 프로그램을 작성하시오.

수빈이가 지금 보고 있는 채널은 100번이다.

 

입력


더보기

첫째 줄에 수빈이가 이동하려고 하는 채널 N (0 ≤ N ≤ 500,000)이 주어진다. 둘째 줄에는 고장 난 버튼의 개수 M (0 ≤ M ≤ 10)이 주어진다. 고장난 버튼이 있는 경우에는 셋째 줄에는 고장난 버튼이 주어지며, 같은 버튼이 여러 번 주어지는 경우는 없다.

 

출력


더보기

첫째 줄에 채널 N으로 이동하기 위해 버튼을 최소 몇 번 눌러야 하는지를 출력한다.

 

풀이방법


알고리즘은 생각보다 간단했다.

1. 만들 수 있는 수 중에서 목표와 가장 가까운 수를 찾는다.

2. 가장 가까운 수와 목표 번호와의 차이를 구한다.

 

가장 가까운 수를 찾는 방법 = 브루트포스를 사용하면 된다.

1부터 시작해서 1,000,000까지 숫자 중 만들 수 있는 수를 찾는다.

알고리즘 구현은 밑에 코드에 자세하게 적어놨다.

 

코드


# gold
# 리모컨
import sys

def main():
    target = int(input())
    # ++ or -- 로 이동할 경우 -> 최댓값
    ans = abs(100 - target)  
    
    # 고장난 버튼 입력
    M = int(input())
    if M > 0:
        broken = set(input().split())
    else:
        broken = set()

    # 작은수에서 큰수로 이동할 땐 500,000이며
    # 큰수에서 작은수로 이동할 땐 1,000,000까지 봐야한다.
    for num in range(1000001):
        for N in str(num):
        	# 만들 수 없는 숫자인 경우
            if N in broken: 
                break
        # 만들 수 있는 숫자인 경우  
        else:  
            # min(기존 답, 버튼을 누른 횟수 + 해당 번호와의 차이)
            if ans > len(str(num)) + abs(num - target):
                ans = len(str(num)) + abs(num - target)

    print(ans)


if __name__ == '__main__':
    input = sys.stdin.readline
    main()

 

 

728x90