백준 파이썬 Today I Learn 2023.04.08
4. 08 파이썬 공부
오늘은 과제 공부
import numpy as np
import matplotlib.pyplot as plt
# 데이터 로드(첫번째 행 스킵 및 1,2 열만 사용)
data = np.loadtxt('CM.csv', delimiter=',', skiprows=1, usecols=(0, 1))
# 산점도(scatter plot) 그리기 & x,y 축 이름 붙이기
plt.scatter(data[:, 1], data[:, 0], s=1, c='black', alpha=0.5)
plt.xlabel('bp_rp')
plt.ylabel('MagG')
# x값 구간 100개로 나누고 중간값 구하기
bprp = np.linspace(data[:, 1].min(), data[:, 1].max(), 100)
bcenters = 0.5 * (bprp[:-1] + bprp[1:])
# y값 중간값(median) 구하기
digitized = np.digitize(data[:, 1], bprp)
magG_median = [np.median(data[:, 0][digitized == i]) for i in range(1, len(bprp))]
# 중간값 선 그리기(붉은색 직선, 선 굵기 2.5)
plt.plot(bcenters, magG_median, 'r-', linewidth=2.5)
plt.show()
1) 넘파이 csv(엑셀)파일 열기
np.loadtxt('파일이름', delimiter='', skiprows=포함하고 싶지 않은 행, usecols = (이용하고 싶은 열))
2) matplotlib 범례 표시하기
plt.xlabel('x축 이름'): x축 이름 설정
plt.xlabel('y축 이름'): y축 이름 설정
3) matplotlib 산점도 그리기
plt.scatter(x축 데이터, y축 데이터, s=마커의 사이즈 지정, c='마커의 색상 지정', alpha= 투명도)
마커 사이즈는 '크기**2' 로 입력
색상은 숫자 시퀀스 또는 rgb, Hex code 색상을 입력
투명도는 0~1까지 존재
4) numpy 구간 나누기
np.linspace(a, b, c): a 부터 b까지의 숫자들을 일정한 간격으로 c개만큼 나누기
따라서 np.linspace(data[:, 1].min(), data[:, 1].max(), 100)
>>> 데이터의 두번째 열중 가장 작은 수부터 가장 큰 수 를 100개로 나누기
5) matplotlib 선그래프 그리기
plt.plot('x축 데이터', 'y축 데이터', linestyle='선종류', linewidth='선굵기', color='선색깔')
선의 종류 및 지정법:
직선: linestyle = 'solid' 직선
점선: linestyle = 'dotted' ..........
대쉬: linestyle = 'dashed' ----------
대쉬 닷: linestyle = 'dashdot' -.-.-..-.-.
6) matplotlib 선 포맷 문자열
직선: '색-'
대쉬: '색--'
점선: '색:'
대쉬 닷: '색-.'
7) 리스트의 슬라이싱 심화
a =[1, 2, 3, 4, 5, 6]
a[:]: 처음부터 끝까지 (전체)
>>>[1, 2, 3, 4, 5, 6]
a[1:]: 2번째 항목부터 끝까지
>>>[2, 3, 4, 5, 6]
a[:-1]: 마지막 값 제외하고 전체
>>>[1, 2, 3, 4, 5]
8) np.digitize(data, 기준)
data 값을 기준에 따라 1~ len(기준)으로 구간을 나누어 저장
ex)
data = ([0.1, 2.3, 1.8, 4.3, 4.7])
기준 = ([0, 1, 2, 3, 4, 5])
np.digitize(data, 기준)
>>> ([1, 3, 2, 4, 4])
- 기준[n]<data[i]<기준[n+1] : data[i]의 digitized 값 == n+1
2. 백준 1668번 트로피 진열
첫째 줄에 트로피의 개수 N (1 ≤ N ≤ 50)이 주어진다.
둘째 줄부터 N개의 줄에 왼쪽의 트로피부터 차례대로 높이가 주어진다.
트로피의 높이는 100보다 작거나 같은 자연수이다.
첫째 줄에 왼쪽에서 봤을 때 보이는 개수, 둘째 줄에 오른쪽에서 봤을 때 보이는 개수를 출력한다.
# 숫자 n 입력 받기
n = int(input())
a = []
# 숫자 n 만큼 숫자 입력받고 a 리스트에 저장하기
for i in range(n):
l = int(input())
a.append(l)
x, y = 0, 0
v, w = 0, 0
# 왼쪽부터 크기가 더 크면 카운트 +1 아니면 그대로
for j in range(len(a)):
if a[j]>v:
x += 1
v = a[j]
# 오른쪽도 동일하게
for k in reversed(range(len(a))):
if a[k]>w:
y +=1
w = a[k]
print(x,y,sep='\n')
1) for i in reversed(range(a)):
a-1 부터 0까지 a번 거꾸로 반복하기
ex)
for i in reversed(range(5)):
print(i)
>>>
4
3
2
1
0