인덱싱과 슬라이싱은 데이터가 저장된 구조를 이해한 상태에서 숫자를 자유자재로 이용해야 하니 상당히 헷갈리면서도 머리 아프다. 반복 숙달밖에 답이 없다.


1차원 배열

1차원은 리스트와 크게 다르지 않아 비교적 익숙하게 접근할 수 있다.

# 1차원 배열 인덱싱
arr = np.arange(1, 11)

print(arr[1], arr[3], arr[9])
print(arr[-1], arr[-5])

# 1차원 배열 슬라이싱
print(arr[2:7])     # 3 ~ 7
print(arr[::2])     # 홀수만
print(arr[4:])      # 5 ~ 10
print(arr[:7])      # 1 ~ 7
print(arr[::-1])    # 전체 역순

 


2차원 배열

# 2차원 배열 인덱싱
arr_2d = np.array([[10, 20, 30], [40, 50, 60]])

print(arr_2d)
print(arr_2d.shape)
print(arr_2d[0])
print(arr_2d[0][0], arr_2d[0, 1], arr_2d[(0, 2)])

print(arr[1][0])
print(arr[2][1])
print(arr[-1][-2])

다차원 배열의 인덱싱은 크게 [m][n], [m, n], (m, n) 세 가지가 있다.

하지만 맨 앞의 [m][n]은 조금 의미가 다른데, 특정 상황에서만 뒤의 두 방법과 동일하게 작동하는 문법이다.

슬라이싱을 해보면 바로 차이가 나타난다.

 

# 2차원 배열 슬라이싱
arr = np.array([[10, 20, 30], [40, 50, 60], [70, 80, 90]])

print(arr)
print(arr[:2, :2])
print(arr[:2][:2])

위와 같이 시도했을 때,

arr[:2, :2]

arr[:2][:2]

이 두 방식의 결과가 달라서 고민을 꽤 했다.


print(arr[:2, :2]) # [행 슬라이싱, 열 슬라이싱]

이 표현은 둘째 행까지 자르고, 둘째 열까지 자르는 동작을 동시에 한다.

그래서 9칸 중 4칸을 잘라낼 수 있다.


print(arr[:2][:2]) # 행을 잘라 새로운 행렬을 만들고, 거기서 다시 행을 잘라 새로운 행렬

이 표현은 arr[:2]를 진행한 새로운 행렬을 생성한 후, 뒤에 있는 [:2]를 적용한다.

원본에서 둘째 행까지 추출한 2 x 3 행렬이 된 상태에서 다시 둘째 행까지를 추출한다.

즉, [:m][:n][:k] ... 이 표현은 행만 자르는 작업을 반복하는 동작이다.


# 슬라이싱 = shape 유지 (차원 유지)
print(arr[:-1, :1], arr[:-1, :1].shape)

# index 접근 -> 값을 꺼내서 반환 (원본 차원 X)
print(arr[:-1, 0], arr[:-1, 0].shape)

슬라이싱은 그냥 원본 배열을 잘라낸 것이지 내용물을 건드린게 아니기에 차원이 유지된다.

반면 인덱싱은 배열에서 추출한 값으로 새로운 결과물을 반환하는 것이므로, 원본의 차원과 관련이 없게 된다.


팬시 인덱싱(Fancy indexing)

정수 배열을 위치 인자에 넣어 여러 인덱스를 추출하는 방법

# 1차원 배열 fancy indexing
arr = np.arange(5, 31, 5)
print(arr)
print(arr[[1, 3, 5]])

indices = [1, 3, 5]
print(arr[indices])    # == print(arr[[1, 3, 5]])

 

2차원 배열의 팬시 인덱싱은 주의할 필요가 있다.

# 2차원 배열 fancy indexing
arr = np.array([[5, 10, 15, 20], 
                [25, 30, 35, 40], 
                [45, 50, 55, 60]
                ])

# [10 35]
indices1 = [0, 1]
indices2 = [1, 2]
print(arr[indices1, indices2])
print(arr[[0, 1], [1, 2]])

# [25 55]
print(arr[[1, 2], [0, 2]])

25와 55를 추출하는 예제의 경우 혼동하기 쉬운 상황.

바깥의 콤마를 기준으로, 좌측 배열은 행을 가리키고 우측 배열은 열을 가리킨다.

위 코드는 1행 0열, 2행 2열에서 값을 가져온다는 뜻이다. 두 배열의 같은 인덱스끼리 짝을 지어주면 된다.

'Python' 카테고리의 다른 글

[DA] NumPy 입문  (0) 2025.09.08
[DA] 데이터 분석이란?  (0) 2025.09.08
[Python] Streamlit으로 페이지 만들어보기  (0) 2025.08.31
[Python] 모듈이란?  (0) 2025.08.26
[Python] 파이썬 가상환경 구축하기  (0) 2025.08.24

NumPy란?

다차원 행렬과 연산을 지원하며 수학적 연산을 빠르게 수행하도록 설계된 라이브러리

 

리스트 vs NumPy

항목 리스트 NumPy
속도 느림 빠름
메모리 사용 사용량 높음 비교적 낮음
데이터 형식 여러 자료형 혼합 동일한 하나의 자료형만 허용
연산 방식 반복문 등 외부 문법 필요 벡터화된 연산 지원

 

※ NumPy는 기본적으로 대량의 데이터를 다루는 데에 특화되어 있음

 

배열 생성 및 배열 상태 확인

import numpy as np
arr = np.array([2025, 9, 8, 18, 21])

print(arr.shape)    # 형태
print(arr.ndim)     # 깊이(차원)
print(arr.size)     # 요소 개수
print(arr.dtype)    # 요소의 데이터 타입

위 코드 결과

⚠️ 주의
1차원 배열은 (5, )와 같이 [차수] 없이 [요소의 개수]만 출력됨
(1, 5)라는 표기는 나오지 않음

 

arr_int = np.array([2025, 9, 8])
print(arr_int.dtype)    # int64 (8byte)

arr_float = np.array([1.234, 3.456, 9.876])
print(arr_float.dtype)  # float64

arr_bool = np.array([True, False, True, False])
print(arr_bool.dtype)   # bool

arr_str = np.array(['hello', 'world', 'numpy-lib', 'great'])
print(arr_str.dtype)    # <U9 : U(유니코드) + 요소 중 가장 긴 문자열 길이

위 코드 결과

 

특정 값으로 초기화된 배열

# zeros
arr_z = np.zeros((3, 3))
print(arr_z, arr_z.dtype)

# ones
arr_o = np.ones((5, 2))
print(arr_o, arr_o.dtype)

# full
arr_f = np.full((4, 2), 7)
print(arr_f, arr_f.dtype)

 

임의의 특정 배열과 같은 형태(like)로 새 배열 생성

# 원본 행렬을 넣고 '그와 같은 형태'로 생성하기
arr = np.array([[10, 20], [30, 40]])
print(arr.shape)

# zeros_like
print(np.zeros_like(arr))

# ones_like
print(np.ones_like(arr))

# full_like
print(np.full_like(arr, 9))

 

수열 생성

  • arange : 특정 범위 내 숫자들
  • linspace : 특정 범위 내 숫자들을 균등한 간격으로
  • logspace : linspace의 로그 버전
# np.arange(start, end, step)
# range와 사용법 동일
arr = np.arange(1, 10)
arr = np.arange(10)

# 결과
# [1 2 3 4 5 6 7 8 9 10]

---
# np.linspace(start, end, num=50)
# 양 끝값을 포함하는(이상/이하) 범위에서 num개의 개수만큼 분할된 수열
arr = np.linspace(1, 10, 5)

# 결과
# [ 0.   2.5  5.   7.5 10. ]

---
# np.logspace(시작지수, 끝지수, num, base=10)
arr = np.logspace(1, 3, 4)

# 결과
# [  10.           46.41588834  215.443469   1000.        ]

 

대학 때 겉핥기로 배우고 본격적으로 다시 배우는 데이터 분석.

복습하지 않으면 정말 큰일날 것 같다.


데이터의 종류

정형 데이터

  • 특정한 구조를 가진 데이터
  • 행과 열의 표 형태로 저장 가능한 형태(엑셀, CSV 등)

비정형 데이터

  • 고정된 구조가 없음
  • 언어, 이미지, 영상, 음성 등

 

데이터 과학

비즈니스에서 의미 있는 결과를 추출하기 위해 수학, 통계, 컴퓨터 공학 등을 결합하여 데이터를 연구하는 것

  • 데이터 : 단순히 숫자나 어떠한 사실을 담은 자료 (ex. 20대 한국인들의 키)
  • 정보 : 데이터로부터 유의미한 지식이나 결과를 도출한 것 (ex. 20대 평균 키가 얼마인 것에 대한 영양학적 접근)

 

데이터 분석

원시 데이터를 의미 있는 결과로 변환하여 의사 결정이나 비즈니스에 활용 가능케 하는 것

  • 의사 결정에 과학적이고 객관성 있는 근거 부여
  • 트렌드를 빠르게 파악하고 대응 가능
  • 고객 수요 발굴을 통해 비즈니스 기회 창출
  • 모니터링과 예측을 통한 잠재적 위험 관리

※ 프로젝트에서 반드시 선행되어야 하는 단계

 

데이터 분석 프로세스

1. 비즈니스 이해 : 프로젝트 목표와 요구사항 정의

  • 데이터 분석가는 해당 도메인의 실무자가 아님
  • 실무자와의 협업을 통해 해당 도메인에 대한 이해 습득

2. 데이터 이해 : 프로젝트에 사용될 데이터를 이해

  • 앞선 이해를 기반으로 데이터 파악
  • 데이터의 수치가 의미하는 것, 이상치 및 누락값 등 파악

3. 데이터 준비 : 분석에 적합한 형태로 데이터 가공

  • 필요에 따라 정리, 변환, 통합 등
  • 분석에 바로 사용 가능한 데이터셋 생성

4. 모델링 : 데이터에 적합한 모델 선택 및 학습

  • 모델 선택에는 프로젝트에 대한 이해와 선택의 필요성이 반드시 있어야 함

5. 평가 : 모델의 성능과 비즈니스 목표 적합성 평가

 

6. 배포 : 실제 비즈니스 환경에 적용

'Python' 카테고리의 다른 글

[DA] NumPy 배열 인덱싱 & 슬라이싱  (0) 2025.09.09
[DA] NumPy 입문  (0) 2025.09.08
[Python] Streamlit으로 페이지 만들어보기  (0) 2025.08.31
[Python] 모듈이란?  (0) 2025.08.26
[Python] 파이썬 가상환경 구축하기  (0) 2025.08.24

1. Streamlit이란?

Python 기반의 프레임워크로 웹 페이지의 UI를 비교적 간단하고 빠르게 구축할 수 있게 해주는 도구.

streamlit 자체 메서드 외에도 matplotlib이나 pandas 같은 시각화 라이브러리와 연계성이 좋아 차트를 그리거나 대시보드 구성에 용이하다.

복잡한 프론트엔드 지식 없이도, 파이썬 문법을 사용해 어느정도 구색을 갖춘 페이지를 만들 수 있다.

 

2. 설치 및 실행

# 설치
pip install streamlit

# 설치 확인을 위한 데모 페이지(로컬)
streamlit hello

# 실행
streamlit run [파일명.py]

 

데모 페이지

브라우저에 이 화면이 출력되면 정상 설치된 것이다.

 

 

'Python' 카테고리의 다른 글

[DA] NumPy 배열 인덱싱 & 슬라이싱  (0) 2025.09.09
[DA] NumPy 입문  (0) 2025.09.08
[DA] 데이터 분석이란?  (0) 2025.09.08
[Python] 모듈이란?  (0) 2025.08.26
[Python] 파이썬 가상환경 구축하기  (0) 2025.08.24

모듈

단일 파이썬 파일(.py)

  • 레고처럼 여기저기 조립할 수 있게끔 갖다붙일 수 있다.
  • 파일(.py)이 다르다 == 서로 다른 모듈이다
  • 서로 다른 모듈에서 같은 이름의 변수/함수가 선언되어도 충돌 X
    • 서로 영역이 다르고, import 해서 쓸 땐 모듈명을 명시하기 때문
    • 서울에 사는 '길동'이와 부산에 사는 '길동'

패키지

모듈의 집합

  • 서로 관련 있는 기능을 하는 모듈들을 모아놓은 것
  • 여러 파일(.py)이 모여있는 폴더

 

# 특정 모듈 or 패키지 불러오기
import [모듈명]

# 특정 모듈 or 패키지에서 특정 파트만 가져오기
# 특정 변수나 함수까지 지정 가능하지만 자잘하게 나열하면 지저분해질 수 있음
from [모듈명] import [세부 요소]

# 특정 모듈 or 패키지를 불러온 후 별칭 부여하기
# 긴 이름을 일일이 쓰기 번거롭다!
import [모듈명] as [별칭]

 

프로젝트 패키지 공유하기

requirements.txt

  • 프로젝트에 종속된 패키지나 라이브러리들의 버전 정보가 나열된 파일
  • 프로젝트별로 독립된 환경을 유지하고, 어떤 장치에서도 동일한 환경 보장
# 파일 생성
pip freeze > requirements.txt

# requirements에 있는 패키지 일괄 설치
pip install -r requirements.txt

'Python' 카테고리의 다른 글

[DA] NumPy 배열 인덱싱 & 슬라이싱  (0) 2025.09.09
[DA] NumPy 입문  (0) 2025.09.08
[DA] 데이터 분석이란?  (0) 2025.09.08
[Python] Streamlit으로 페이지 만들어보기  (0) 2025.08.31
[Python] 파이썬 가상환경 구축하기  (0) 2025.08.24

가상환경이 필요한 이유?

개발을 할 때, 개발에 들어간 도구들(패키지나 라이브러리 등)의 버전 관리는 중요하다.

 

하나의 디바이스에서 여러 프로젝트를 굴릴 때, 서로 다른 버전을 사용하는 프로젝트끼리 충돌이 일어나거나, 한쪽에 맞추어진 설정값이 다른 쪽에 영향을 주게 된다면 무조건 야근각이 잡힐 것이다.

 

→ 프로젝트별로 독립적인 환경으로 분리해둘 필요가 있다.

→ 컴퓨터를 여러 대 쓰는건 힘드니 가상환경을 생성한다.

 

1.  가상환경 생성

Anaconda 설치 후 프롬프트를 사용해 가상환경을 만든다.

# 가상환경 생성
ex) conda create -n pystudy_env python=3.12

# 가상환경 확인
conda info --envs

# 가상환경 활성화/비활성화
conda activate pystudy_env

# 가상환경 삭제
conda remove --name pystudy_env

 

가상환경이 정상적으로 생성된 화면

 

가상환경을 활성화하면 경로 앞에 현재 환경이 뜬다

2. 라이브러리 설치

# Python을 실행하기 위한 엔진
pip install jupyter notebook

# 엔진을 돌리기 위한 전반적인 환경(커널)
pip install ipykernel

 

그리고 Jupyter 위에 커널을 설치해준다.

python -m ipykernel install --user --name pystudy_env --display-name pystudy_env

 

이 명령어를 해석하면 다음과 같다.

  1. python -m ipykernel = python 명령어로 ipykernel 모듈을 불러와서
  2. install --user --name pystudy_env = 현재 사용자에 대해 가상환경을 설치해주는데 그 환경 이름은 pystudy_env
  3. --display-name pystudy_env = 추후 가상환경 선택 시 노출되는 표시명(가상환경명과 동일하게 해줌)

 

3. 가상환경 적용 확인

설치된 가상환경이 표시된다

 

VS Code를 열어 test.ipynb 확장자로 파일을 생성하고, [커널 선택]을 눌러 pystudy_env가 표시되는 것을 확인한다.

이제까지 복잡한 프로젝트를 할 일이 없어 컴퓨터 자체에 파이썬을 깔고 썼는데, 가상환경을 적극적으로 활용해봐야겠다.

'Python' 카테고리의 다른 글

[DA] NumPy 배열 인덱싱 & 슬라이싱  (0) 2025.09.09
[DA] NumPy 입문  (0) 2025.09.08
[DA] 데이터 분석이란?  (0) 2025.09.08
[Python] Streamlit으로 페이지 만들어보기  (0) 2025.08.31
[Python] 모듈이란?  (0) 2025.08.26

+ Recent posts