라이브러리 NumPy 기초

Joel Lee·2023년 5월 9일
0

AI & DS

목록 보기
6/14
post-thumbnail

[!abstract]+ Curriculum
1. NumPy 란
2. 데이터 조작
3. NumPy 와 메모리
4. Numpy 로 통계해석
5. 앞으로의 학습 진행 방법
첨삭문제


Numpy 란

#np/load

  • NumPy 배열과 사칙연산
    - 브로드캐스트 : 연산 전에 NumPy 배열의 shape 를 맞추는 것
  • 데이터 읽어오기 : delimiter, skiprows, usecols
import numpy as np

arr_1 = np.loadtxt("./4002_new_numpy/csv_example.csv",
				   delimiter=",", # 区切り文字をカンマに指定
				   skiprows=1, # 最初の1行をスキップ
				   usecols=[0, 1, 2]) # 使用する列番号を指定 print(arr_1)
  • 특정 행, 열에 대한 계산
import numpy as np

# csv_example(1.2.4参照)を読み込む
arr_1 = np.loadtxt("./4002_new_numpy/csv_example.csv", delimiter=",", skiprows=1, usecols=[0, 1, 2] )
# Heightの列のみ0.394をかける
# arr_2は1行3列の配列
arr_2 = np.array([1, 0.394, 1])
arr_3 = arr_1 * arr_2
# arr_1とarr_3を比較して出力
print('arr_1') 
print(arr_1) 
print('arr_3') 
print(arr_3)

데이터 조작

  • 리스트처럼 추출
    #np/access
arr_3 = arr_1[::2] # ひとつおきに要素を抽出
  • 리스트에선 불가능한 추출
print(list_1[2][1])
print(arr_1[2, 1])
  • 복수 요소 추출
import numpy as np

list_1 = [[1,2],[3,4],[5,6]]
arr_1 = np.array(list_1)

# リストにより複数要素を抽出
print(arr_1[[2, 1]])
>>> 出力結果
[[5 6]
 [3 4]]
  • 3 차원 이상 배열의 축 바꾸기
    #np/transpose
import numpy as np

list_1 = [[[1, 2], [3, 4], [5, 6]], [[7, 8], [9, 10], [11, 12]]]
arr_1 = np.array(list_1)

print('軸の入れ替え前 arr_1.shape: ', arr_1.shape)
print(arr_1)

arr_2 = arr_1.transpose(1, 0, 2)
print('arr_1を0軸と1軸の入れ替え後 arr_2.shape: ', arr_2.shape)
print(arr_2)

arr_3 = arr_2.transpose(2, 1, 0)
print('arr_2を0軸と2軸で入れ替え後 arr_3.shape: ', arr_3.shape)
print(arr_3)
>>> 出力結果
軸の入れ替え前 arr_1.shape:  (2, 3, 2)
[[[ 1  2]
  [ 3  4]
  [ 5  6]]

 [[ 7  8]
  [ 9 10]
  [11 12]]]
arr_1を0軸と1軸の入れ替え後 arr_2.shape:  (3, 2, 2)
[[[ 1  2]
  [ 7  8]]

 [[ 3  4]
  [ 9 10]]

 [[ 5  6]
  [11 12]]]
arr_2を0軸と2軸で入れ替え後 arr_3.shape:  (2, 2, 3)
[[[ 1  3  5]
  [ 7  9 11]]

 [[ 2  4  6]
  [ 8 10 12]]]
  • 배열 형태 변경 reshape : 인수에 -1 을 넣으면 자동으로 맞춰줌.
    #np/reshape
import numpy as np

np.random.seed(1)

# arr_1を作成(ここは変更しないでください)
rand_row, rand_col = np.random.randint(1, 10, 2)
arr_1 = np.random.rand(rand_row, rand_col)

# arr_1のshapeを変更し、arr_2に代入しましょう
arr_2 = arr_1.reshape(-1,1)
print(arr_2)

#np/resize

  • 배열 형태 변경 resize
    - in-place 처리

NumPy 와 메모리

  • 데이터타입
    #np/dtype
import numpy as np

arr_1 = np.array([1, 2, 3, 4, 5], dtype=np.int8) # ここでデータ型を「int8」に指定
print(arr_1.dtype) # データ型を確認
print(arr_1)
>>> 出力結果
int8
[1 2 3 4 5]

#np/sort

  • In-place 처리 : .sort(), .resize()

View 에 대해

#np/view

  • 변수에 NumPy 배열 대입 → 그 배열의 view 가 만들어짐 (메모리 공유)
  • 슬라이스로 일부 뷰 가능
  • .copy() 는 메모리를 공유하지 않는 복사본 생성
import numpy as np


arr_1 = np.array([1, 2, 3, 4, 5])

# arr_1のビューを作成しましょう
arr_2 = arr_1[:2]
arr_2[1] = 100

print(arr_1)
print(arr_2)
>>> 出力結果
[ 1 100 3 4 5]
[ 1 100]

NumPy 로 통계해석

#np/stats

  • 분산 .var(axis=number)
  • 최대값, 최소값의 인덱스 .argmax(), .argmin()
  • sort 된 인덱스 .argsort()
  • numpy.where() 함수 링크

첨삭문제

(기본) NumPy 처리속도 테스트

import numpy as np

# 乱数の初期化
np.random.seed(0)

# 指定された大きさの画像を乱数を用いて生成する関数
# 仮引数mは画像の縦の大きさ、nは画像の横の大きさです
def make_image(m, n):
  # m×n行列の各成分を0~5の値でランダムに満たしてください
  image = np.random.randint(1, 6, size=(m, n))
  return image
  
# 渡された行列の一部を変更する関数
def change_matrix(matrix):
  # 与えられた行列の形を取得し、shapeに代入してください
  shape = matrix.shape
  # 行列の各成分について、変更するかしないかをランダムに決めた上で
  # 変更する場合は0~5のいずれかの整数にランダムに入れ替えてください
  tmp_matrix = matrix.reshape(-1,1)
  for i in range(len(tmp_matrix)):
    if np.random.randint(0,2) == 1:
      tmp_matrix[i] = np.random.randint(1, 5)
  return tmp_matrix.reshape(shape)

# ランダムに画像を作成
image1 = make_image(3, 3)
print(image1)

# ランダムに変更を適用する
image2 = change_matrix(np.copy(image1))
print(image2)

# image1とimage2の差分を計算し、image3に代入してください
image3 = image1 - image2
print(image3)

# image3の各成分が絶対値である行列をもとめimage3に再代入してください
image3 = np.absolute(image3)

# image3を出力
print(image3)

(응용) 간단화시킨 두 이미지의 차분 계산

  • 0-5의 랜덤한 값을 가지는 3x3행렬 (2차원 배열 = 이미지)를 하나 만들자.
  • 두 번째 이미지는 각 값을 바꿀지 말지 랜덤하게 고른 후, 또 0-5의 랜덤한 값을 부여.
  • 그 후 두 이미지의 차분을 구해보자.
import numpy as np

# 乱数の初期化
np.random.seed(0)

# 指定された大きさの画像を乱数を用いて生成する関数
# 仮引数mは画像の縦の大きさ、nは画像の横の大きさです
def make_image(m, n):
  # m×n行列の各成分を0~5の値でランダムに満たしてください
  image = np.random.randint(0, 6, size=(m, n))
  return image

# 渡された行列の一部を変更する関数
def change_matrix(matrix):
  # 与えられた行列の形を取得し、shapeに代入してください
  shape = matrix.shape
  # 行列の各成分について、変更するかしないかをランダムに決めた上で
  # 変更する場合は0~5のいずれかの整数にランダムに入れ替えてください
  tmp_matrix = matrix.reshape(-1,1)
  for i in range(len(tmp_matrix)):
    if np.random.randint(0,2) == 1:
      tmp_matrix[i] = np.random.randint(0, 6)
  return tmp_matrix.reshape(shape)

# ランダムに画像を作成
image1 = make_image(3, 3)
print(image1)

# ランダムに変更を適用する
image2 = change_matrix(np.copy(image1))
print(image2)

# image1とimage2の差分を計算し、image3に代入してください
image3 = image1 - image2
print(image3)

# image3の各成分が絶対値である行列をもとめimage3に再代入してください
image3 = np.absolute(image3)

# image3を出力
print(image3)
profile
개발자 전직을 향해 나아가고 있는 Technical Sales Engineer

0개의 댓글