{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "53bac79d",
   "metadata": {},
   "source": [
    "# 1. NumPy 기초 배열 생성\n",
    "\n",
    "## 📚 학습 목표\n",
    "- NumPy 배열의 기본 개념 이해\n",
    "- 다양한 방법으로 배열 생성하기\n",
    "- 배열의 형태와 차원 이해하기\n",
    "- 실전에서 활용할 수 있는 배열 생성 기법 습득\n",
    "\n",
    "## 🔍 문제 설명\n",
    "\n",
    "NumPy는 Python에서 수치 계산을 위한 핵심 라이브러리입니다. 데이터 분석, 머신러닝, 과학 계산 등에서 배열을 효율적으로 다루기 위해 사용됩니다. 이번 문제에서는 NumPy의 기본적인 배열 생성 방법들을 연습해보겠습니다.\n",
    "\n",
    "### 실전 활용 사례\n",
    "- **데이터 분석**: 대용량 데이터를 효율적으로 처리\n",
    "- **머신러닝**: 특성(feature) 벡터 생성\n",
    "- **이미지 처리**: 픽셀 데이터를 배열로 표현\n",
    "- **금융 분석**: 주가, 수익률 등의 시계열 데이터 처리\n",
    "\n",
    "## 📝 문제\n",
    "\n",
    "### 문제 1-1: 기본 배열 생성\n",
    "1. 0부터 20까지의 짝수만 포함하는 1차원 배열을 생성하세요.\n",
    "2. 3x3 단위행렬(identity matrix)을 만드세요.\n",
    "3. 0~1 사이의 난수 10개를 생성하세요.\n",
    "\n",
    "### 문제 1-2: 다양한 배열 생성 방법\n",
    "4. 1부터 15까지의 숫자로 3x5 행렬을 만드세요.\n",
    "5. 모든 원소가 5인 4x4 배열을 생성하세요.\n",
    "6. 0부터 1까지 0.1 간격으로 배열을 만드세요.\n",
    "\n",
    "### 문제 1-3: 특수 배열 생성\n",
    "7. 2차원 배열에서 대각선 원소만 1이고 나머지는 0인 5x5 배열을 만드세요.\n",
    "8. 1부터 25까지의 숫자로 5x5 배열을 만들고, 짝수만 추출하세요.\n",
    "\n",
    "## 💡 해답 및 설명\n",
    "\n",
    "### 해답 1-1: 기본 배열 생성\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e2571a3d",
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "\n",
    "# 1. 0부터 20까지의 짝수만 포함하는 1차원 배열\n",
    "even_numbers = np.arange(0, 21, 2)\n",
    "print(\"짝수 배열:\", even_numbers)\n",
    "# 출력: [ 0  2  4  6  8 10 12 14 16 18 20]\n",
    "\n",
    "# 2. 3x3 단위행렬(identity matrix)\n",
    "identity_matrix = np.eye(3)\n",
    "print(\"\\n3x3 단위행렬:\")\n",
    "print(identity_matrix)\n",
    "# 출력:\n",
    "# [[1. 0. 0.]\n",
    "#  [0. 1. 0.]\n",
    "#  [0. 0. 1.]]\n",
    "\n",
    "# 3. 0~1 사이의 난수 10개\n",
    "np.random.seed(42)  # 재현 가능한 결과를 위해 시드 설정\n",
    "random_numbers = np.random.random(10)\n",
    "print(\"\\n0~1 사이의 난수 10개:\")\n",
    "print(random_numbers)\n",
    "# 출력: [0.37454012 0.95071431 0.73199394 0.59865848 0.15601864 0.15599452 0.05808361 0.86617615 0.60111501 0.70807258]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "bf287dbb",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 해답 1-2: 다양한 배열 생성 방법\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "73a64ebe",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 4. 1부터 15까지의 숫자로 3x5 행렬\n",
    "matrix_3x5 = np.arange(1, 16).reshape(3, 5)\n",
    "print(\"3x5 행렬:\")\n",
    "print(matrix_3x5)\n",
    "# 출력:\n",
    "# [[ 1  2  3  4  5]\n",
    "#  [ 6  7  8  9 10]\n",
    "#  [11 12 13 14 15]]\n",
    "\n",
    "# 5. 모든 원소가 5인 4x4 배열\n",
    "array_of_fives = np.full((4, 4), 5)\n",
    "print(\"\\n모든 원소가 5인 4x4 배열:\")\n",
    "print(array_of_fives)\n",
    "# 출력:\n",
    "# [[5 5 5 5]\n",
    "#  [5 5 5 5]\n",
    "#  [5 5 5 5]\n",
    "#  [5 5 5 5]]\n",
    "\n",
    "# 6. 0부터 1까지 0.1 간격으로 배열\n",
    "linspace_array = np.linspace(0, 1, 11)\n",
    "print(\"\\n0부터 1까지 0.1 간격 배열:\")\n",
    "print(linspace_array)\n",
    "# 출력: [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. ]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "5d563781",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 해답 1-3: 특수 배열 생성\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "917754d7",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 7. 대각선 원소만 1인 5x5 배열\n",
    "diagonal_matrix = np.eye(5)\n",
    "print(\"대각선 원소만 1인 5x5 배열:\")\n",
    "print(diagonal_matrix)\n",
    "\n",
    "# 8. 1부터 25까지의 숫자로 5x5 배열을 만들고 짝수만 추출\n",
    "matrix_5x5 = np.arange(1, 26).reshape(5, 5)\n",
    "print(\"\\n1부터 25까지의 5x5 배열:\")\n",
    "print(matrix_5x5)\n",
    "\n",
    "even_elements = matrix_5x5[matrix_5x5 % 2 == 0]\n",
    "print(\"\\n짝수만 추출:\")\n",
    "print(even_elements)\n",
    "# 출력: [ 2  4  6  8 10 12 14 16 18 20 22 24]"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "d42cbee4",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## 🔧 주요 함수 설명\n",
    "\n",
    "### 배열 생성 함수들\n",
    "- `np.arange(start, stop, step)`: 등차수열 배열 생성\n",
    "- `np.linspace(start, stop, num)`: 균등 간격 배열 생성\n",
    "- `np.zeros(shape)`: 0으로 채워진 배열 생성\n",
    "- `np.ones(shape)`: 1로 채워진 배열 생성\n",
    "- `np.full(shape, value)`: 특정 값으로 채워진 배열 생성\n",
    "- `np.eye(n)`: n×n 단위행렬 생성\n",
    "- `np.random.random(size)`: 0~1 사이의 난수 배열 생성\n",
    "\n",
    "### 배열 변형 함수들\n",
    "- `array.reshape(shape)`: 배열의 형태 변경\n",
    "- `array.flatten()`: 1차원 배열로 평탄화\n",
    "- `array.T` 또는 `array.transpose()`: 전치(transpose)\n",
    "\n",
    "## 📊 추가 연습문제\n",
    "\n",
    "### 연습문제 1\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "e24223f1",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 다음 문제들을 풀어보세요:\n",
    "# 1. 1부터 100까지의 홀수만 포함하는 배열을 만드세요.\n",
    "# 2. 0부터 1까지 0.01 간격으로 배열을 만드세요.\n",
    "# 3. 모든 원소가 3.14인 2x3 배열을 만드세요."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "770bf786",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 연습문제 2\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "6bdc7f77",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 다음 문제들을 풀어보세요:\n",
    "# 1. 1부터 16까지의 숫자로 4x4 배열을 만들고, \n",
    "#    대각선 원소들의 합을 구하세요.\n",
    "# 2. 0부터 9까지의 숫자로 3x3 배열을 만들고,\n",
    "#    3의 배수만 추출하세요."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "6a02b795",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## ⚠️ 주의사항 및 팁\n",
    "\n",
    "1. **인덱싱**: NumPy 배열의 인덱스는 0부터 시작합니다.\n",
    "2. **데이터 타입**: 배열의 모든 원소는 같은 데이터 타입을 가집니다.\n",
    "3. **메모리 효율성**: NumPy 배열은 Python 리스트보다 메모리 효율적입니다.\n",
    "4. **브로드캐스팅**: 서로 다른 크기의 배열 간 연산이 가능합니다.\n",
    "5. **시드 설정**: `np.random.seed()`를 사용하면 재현 가능한 난수를 생성할 수 있습니다.\n",
    "\n",
    "## 🎯 실전 활용 예제\n",
    "\n",
    "### 예제 1: 주식 가격 데이터 생성\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "812d7562",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 30일간의 주식 가격 데이터 생성\n",
    "np.random.seed(42)\n",
    "initial_price = 1000\n",
    "daily_returns = np.random.normal(0.001, 0.02, 30)  # 일일 수익률\n",
    "prices = initial_price * (1 + daily_returns).cumprod()\n",
    "print(\"30일간 주식 가격:\")\n",
    "print(prices)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "e8bd6714",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "### 예제 2: 이미지 데이터 시뮬레이션\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "id": "a7f072bb",
   "metadata": {},
   "outputs": [],
   "source": [
    "# 28x28 픽셀의 흑백 이미지 데이터 생성 (MNIST 스타일)\n",
    "image_data = np.random.randint(0, 256, (28, 28))\n",
    "print(\"이미지 데이터 형태:\", image_data.shape)\n",
    "print(\"픽셀 값 범위:\", image_data.min(), \"~\", image_data.max())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "f78b349b",
   "metadata": {},
   "source": [
    "\n",
    "\n",
    "## 📚 다음 단계\n",
    "\n",
    "이제 NumPy 배열 생성의 기본을 익혔습니다. 다음 단계에서는:\n",
    "- 배열 인덱싱과 슬라이싱\n",
    "- 배열 연산과 브로드캐스팅\n",
    "- 조건부 필터링\n",
    "- 집계 함수 사용법\n",
    "\n",
    "을 학습하게 됩니다.\n",
    "\n",
    "---\n",
    "\n",
    "**참고 자료:**\n",
    "- [NumPy 공식 문서](https://numpy.org/doc/stable/)\n",
    "- [NumPy 배열 생성 가이드](https://numpy.org/doc/stable/user/basics.creation.html) "
   ]
  }
 ],
 "metadata": {},
 "nbformat": 4,
 "nbformat_minor": 5
}
