별의 공부 블로그 🧑🏻‍💻
728x90
728x170

넘파이 적용

  • 우리가 분석하고자 하는 대용량 데이터들은 어떤 파일 형태 안에 포함될 수 있다.
  • 파이썬을 이용해 이 데이터들을 분석할 수 있고, 도표나 그림 형태로 나타난 결과를 데이터 파일 형태로 만들어 자장할 수 있다.

 

데이터 파일 입력과 출력

  • 파이썬에서 제공하는 데이터 입력과 출력 방법은 크게 3가지로 분류할 수 있다.
    1. 파이썬 고유의 내장 함수를 이용해 처리하는 방법
      • open()
      • read()
      • write()
      • close()
    2. 넘파이를 이용하는 방법
    3. 판다스에서 제공하는 read_csv(), to_csv() 함수를 사용하는 방법
  • 넘파이는 파일을 읽고 데이터 파일로 쓰는 여러 방법을 제공한다.
    • 넘파이 이진 파일
    • 텍스트 파일
    • 원시 이진 파일(Raw Binary File)
    • 메모리 맵 파일(Memory-Mapped File)

 

넘파이 이진 파일

  • 넘파이는 다차원 배열을 효과적으로 처리한다.
    • 또한 생성된 배열들을 컴퓨터만 읽을 수 있는 이진 파일로 저장하는 모델과 이를 처리하는 함수들을 제공한다.
  • NPY 형식(.npy)은 1개의 넘파이 배열을 저장 장치에 저장하는 표준 이진 파일이다.
    • 이 형식은 구조가 다른 컴퓨터에서도 배열을 정확하게 구성하는 데 필요한 모든 shape와 dtype 정보를 저장한다.
  • NPZ 형식(.npz)은 복수의 NPY 파일들을 하나의 ZIP 파일로 구성하는 표준 형식이다.
함수 종류 기능
load(file[, mmap_mode, allow_pickle, ...]) Load arrays or pickled objects from .npy, .npz or pickled files.
save(file, arr[, allow_pickle, fix_imports]) Save an array to a binary file in NumPy .npy format.
savez(file, *args, **kwds) Save several arrays into a single file in uncompressed .npz format.
savez_compressed(file, *args, **kwds) Save several arrays into a single file in compressed .npz format.

 

  • 넘파이에서 데이터를 생성하고 numpy.save() numpy.load() 함수를 사용해 파일들을 저장하고 읽을 수 있다.

 

예제 : 배열 arr을 생성하고 svd.arr 파일로 저장한 다음, 다시 읽어들이기
>>> arr = np.arange(12).reshape(3, 4)
>>> np.save('svd_arr', arr)
>>> np.load('svd_arr.npy')
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

 

  • numpy.savez() 함수를 사용하면 여러 개의 배열들을 압축되지 않은 하나의 파일로 저장하고 열을 수 있다.
>>> arr1 = np.arange(12).reshape(3, 4)
>>> arr2 = arr1 + 1.1
>>> np.savez('svdz_arr', a=arr2, b=arr1)
>>> np.load('svdz_arr.npz')
<numpy.lib.npyio.NpzFile object at 0x0000022FD1EDB940>

>>> arr_zp = np.load('svdz_arr.npz')
>>> arr_zp['a']
array([[ 1.1,  2.1,  3.1,  4.1],
       [ 5.1,  6.1,  7.1,  8.1],
       [ 9.1, 10.1, 11.1, 12.1]])
       
>>> arr_zp['b']
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])

 

텍스트 파일

  • 데이터를 분석할 때, 다양한 데이터와 파일 형식을 처리하게 된다.
  • 이 중 일반적으로 확장자가 .txt 원문 형태의 텍스트 파일과 확장자가 .csv 콤마로 구분되는 텍스트 파일이 있다.
  • 넘파이는 이 텍스트 파일들을 처리하는 함수를 제공한다.
함수 종류 기능
loadtxt(fname[, dtype, comments, delimiter, ...]) Load data from a text file.
savetxt(fname, X[, fmt, delimiter, newline, ...]) Save an array to a text file.
genfromtxt(fname[, dtype, comments, ...]) Load data from a text file, with missing values handled as specified.
fromregex(file, regexp, dtype[, encoding]) Construct an array from a text file, using regular expression parsing.
fromstring(string[, dtype, count, like]) A new 1-D array initialized from text data in a string.
ndarray.tofile(fid[, sep, format]) Write array to a file as text or binary (default).
ndarray.tolist() Return the array as an a.ndim-levels deep nested list of Python scalars.

 

  • 텍스트 파일을 읽고 쓸 때 파일을 해석하기 위해서는 행과 열의 단어들을 구분하는 구분자(Delimiter)가 필요하다.
    • 구분자에는 공백(Space), 탭(Tab), 콤마(Comma)콜론(Colon)이 있다.

 

>>> import numpy as np
>>> from io import StringIO
>>> x = StringIO("0 1 2\n3 4 5")
>>> np.loadtxt(x)
array([[0., 1., 2.],
       [3., 4., 5.]])

 

  • 구분 문자를 사용해 앞 예제와 똑같은 결과를 얻을 수 있다.
>>> import numpy as np
>>> from io import StringIO
>>> x = StringIO("0, 1, 2\n3, 4, 5")
>>> np.loadtxt(x, delimiter=',')
array([[0., 1., 2.],
       [3., 4., 5.]])

 

  • 다음으로 배열을 텍스트 파일로 저장한다.
>>> arr1 = arr2 = arr3 = np.arange(0.0, 5.0, 1.0)
>>> np.savetxt('test1.txt', arr1, delimiter=',')    # arr1은 배열
>>> np.savetxt('test2.txt', (arr1, arr2, arr3))     # 동일 크기의 2차원 배열
>>> np.savetxt('test3.txt', arr1, fmt='%1.4e')      # 지수 표기
>>> np.loadtxt('test1.txt')
array([0., 1., 2., 3., 4.])

>>> np.loadtxt('test2.txt')
array([[0., 1., 2., 3., 4.],
       [0., 1., 2., 3., 4.],
       [0., 1., 2., 3., 4.]])
       
>>> np.loadtxt('test3.txt')
array([0., 1., 2., 3., 4.])
  • 매개 변수 출력 형식 fmt를 %1.4e로 지정하여 배열 arr1을 파일 test3.text에 저장하면, 그 데이터가 지수 형태로 표기된다.
    • %1.4e는 test3.txt로 저장되는 요소가 0.0000e+00의 형식을 가진다는 것을 의미한다.
  • test3.txt 파일을 파이썬 셀에서 loadtxt로 불러오면, fmt 인수를 적용한 결과를 확인할 수 없다.
    • 주피터 노트북 또는 IPython에서 사용하는 파일이 저장된 위치에서 찾을 수 있다.
      • 예) C:\Users\Users
    • test3.txt 파일을 텍스트 에디터로 읽으면, 데이터 형식이 %1.4e 타입인 0.0000e00으로 변경된 것을 확인할 수 있다.

 

  • 넘파이 함수 genfromtxt() 를 사용하면 텍스트 데이터를 편리하게 불러올 수 있다.
>>> arr = np.genfromtxt('C:/user/datafile.csv', delimiter=',')
>>> arr
array([[ 1., 2., 3., 4., 5.],
       [ 6., 7., 8., 9., 10.],
       [ 11., 12., 13., 14., 15.]] )

 

  • 저장된 데이터의 3개 열에 각각 no1, no2, no3로 이름을 붙여 처리할 수 있다.
>>> arr = np.genfromtxt(‘C:/User/datafile.csv’, names=[‘no1’, ‘no2’, ‘no3’], delimiter=’,’)
>>> arr
array([( 1., 2., 3.), ( 6., 7., 8.), ( 11., 12., 13.)], dtype=[(‘no1’, ‘<f8’), (‘no2’, ‘<f8’), (‘no3’, ‘<f8’)])

>>> arr[0]
( 1., 2., 3.)

>>> arr.dtype
dtype([(‘no1’, ‘<f8’), (‘no2’, ‘<f8’), (‘no3’, ‘<f8’)])

 

  • 첫 번째 행을 각 열의 이름으로 사용하려면 다음과 같이 names 옵션을 True로 적용한다.
    • 첫 번째 줄은 헤더이므로 names=True가 적용되면 두 번째 줄부터 읽는다.
>>> arr = np.genfromtxt(‘C:/User/datafile.csv’, names=True, delimiter=’,’)
>>> arr
array([( 6., 7., 8., 9., 10.), ( 11., 12., 13., 14., 15.)], dtype=[(‘1’, ‘<f8’), (‘2’, ‘<f8’), (‘3’, ‘<f8’), (‘4’, ‘<f8’), (‘5’, ‘<f8’)])

 

  • 텍스트 파일은 np.savetxt('C:\User\filenametosave.csv', arr, delimiter='x')와 같은 형식으로 저장한다.

 

원시 이진 파일

  • 이진 파일은 원시 이진(Raw Binary) 형태로 저장된 데이터를 포함하는 파일이다.
  • 이런 형태는 텍스트 문자보다 간결하고 빠르게 처리된다.
  • 대부분의 실행 프로그램들은 컴파일된 수치 데이터 파일인 이진 파일로 저장된다.

 

함수의 종류 기능
fromfile(file[, dtype, count, sep, offset, like]) Construct an array from data in a text or binary file.
ndarray.tofile(fid[, sep, format]) Write array to a file as text or binary (default).

 

  • numpy.fromfile() 함수
    • 텍스트나 이진 파일 데이터에서 배열을 생성한다.
    • 단순한 형태의 텍스트 파일을 파싱하고 알려진 데이터 타입을 가진 이진 데이터를 효율적으로 읽을 수 있다.
      • 파싱(Parsing) : 컴퓨터 언어나 데이터 구조를 문법에 적합하도록 분석하는 것
  • numpy.ndarray.tofile() 함수
    • 텍스트나 이진 배열을 파일로 저장한다.
    • 데이터는 항상 C 순으로 작성된다.
    • fromfile() 함수를 사용하면 저장 데이터를 읽을 수 있다.

 

메모리 맵 파일

  • 메모리 매핑(Mapping)을 이용하면 저장 장치에 있는 커다란 넘파이 배열을 컴퓨터의 시스템 메모리(RAM)에서 처리하는 것처럼 처리할 수 있다.
  • 메모리 매핑은 넘파이 배열을 사용할 수 있도록 메모리 매핑 객체를 생성한다.
  • 넘파이는 메모리 매핑을 위한 memmap 클래스를 제공한다.
  • 메모리 맵 파일은 메모리에 있는 전체 파일을 읽지 않고, 저장 장치에 있는 큰 파일의 작은 부분에 접근하기 위해 사용한다.
  • memmap은 유사 배열 객체이며, 파일과 같은 객체를 사용하는 파이썬의 nmap 모듈과는 다르다.
    • 여기서 파일과 같은 객체는 원시 이진 파일, 버퍼 이진 파일 및 텍스트 파일을 의미한다.
  • memmap 파일을 닫으려면 memmap 인스턴스를 제거해야 한다.
  • memmap 객체는 ndarray가 허용되는 어디서나 사용할 수 있다.
  • 32비트 시스템에서 메모리 맵 파일 크기는 2GB보다 클 수 없다.
  • 파일 시스템에서 memmap 객체가 허용 크기를 넘어 생성되거나 확장되면 새로운 부분의 내용은 입력되지 않는다.

 

예제 : memmap 적용을 위한 data 배열 생성
>>> data = np.arange(12, dtype=’float32’)
>>> data.resize((3,4))
>>> data
array([[ 0., 1., 2., 3.],
       [ 4., 5., 6., 7.],
       [ 8., 9., 10., 11.]], dtype=float32)

 

  • 임시 파일 및 디렉터리를 생성하는 tempfile 모듈의 mkdtemp() 함수를 실행하면 임시 디렉터리가 생성된 것을 확인할 수 있다.
  • 경로 조정을 위해 os.path 모듈을 임포트하고 해당 임시 디렉터리에 newfile.dat 라는 이름을 설정했다.
>>> from tempfile import mkdtemp
>>> import os.path as path
>>> fname = path.join(mkdtemp(), ‘newfile.dat’)
>>> fname
‘C:\\Users\\fycjs\\AppData\\Local\\Temp\\tmp8hxj7q2j\\newfile.dat’

 

  • data와 같은 dtype과 shape를 가지는 fname을 생성한다.
    • fname은 저장 장치에 이진 파일로 저장된 memmap 배열 객체이다.
>>> fp=np.memmap(fname, dtype=’float32’, mode=’w+’, shape=(3,4))
>>> fp
memmap([[ 0., 0., 0., 0.],
        [ 0., 0., 0., 0.],
        [ 0., 0., 0., 0.]], dtype=float32)

 

  • data를 memmap 배열에 쓰면 data가 memmap 배열인 fp에 매핑되는데, 매핑된 파일의 경로가 앞에서 설정한 fname의 절대 경로와 같은지 확인할 수 있다.
  • memmap 객체를 닫기 전에 저장 장치의 메모리 변경 사항을 제거한다.
>>> fp[:] = data[:]
>>> fp
memmap([[ 0., 1., 2., 3.],
        [ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.]], dtype=float32)
        
>>> fp.filename == path.abspath(fname)
True

>>> del fp
  • os.path.abspath(path) 함수는 경로명 path의 정규화된 절대 경로를 반환한다.

 

  • memmap을 로딩하고 data가 저장되었는지 확인한다.
>>> newfp = np.memmap(fname, dtype=’float32’, shape=(3,4))
>>> newfp
memmap([[ 0., 1., 2., 3.],
        [ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.]], dtype=float32)

 

  • 이번에는 읽기만 가능한 memmap 객체를 생성한다.
>>> fpr = np.memmap(fname, dtype=’float32’,mode=’r’, shape=(3,4))
>>> fpr.flags.writeable
False
  • flags는 배열의 메모리 레이아웃 정보를 나타낸다.
  • a.flag['WRITEABLE']와 같이 딕셔너리로 요소에 접근하거나 a.flags.writeable 속성을 이용해 flags 객체에 접근할 수 있다.
  • flags의 writeable 속성은 데이터 영역에 쓸 수 있는지를 나타내며, 속성값이 False라면 데이터를 쓸 수 없이 읽기 전용이라는 것을 의미한다.

 

  • 메모리로 복사할 수 있는 copy-on-write-memmap 객체를 생성한다.
>>> fpc = np.memmap(fname, dtype=’float32’, mode=’c’, shape=(3,4))
>>> fpc.flags.writeable
True
  • copy-on-write는 mode='c'와 같아 값을 할당할 수 있지만, 값들은 메모리로 복사된 배열에 쓰일 뿐이고 저장 장치는 기록되지는 않는다.
    • 따라서 저장 장치에 있는 파일은 읽기 전용이다.
>>> fpc
memmap([[ 0., 1., 2., 3.],
        [ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.]], dtype=float32)

>>> fpc[0,:] = 0
>>> fpc
memmap([[ 0., 0., 0., 0.],
        [ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.]], dtype=float32)

 

  • 저장 장치에 있는 파일이 변하지 않은 것을 확인할 수 있다.
>>> fpr
memmap([[ 0., 1., 2., 3.],
        [ 4., 5., 6., 7.],
        [ 8., 9., 10., 11.]], dtype=float32)

 

  • 다음 예제에서는 매개 변수 offset을 적용한다.
>>> fpo = np.memmap(fname, dtype=’float32’, mode=’r’, offset=16)
>>> fpo
memmap([4., 5., 6., 7., 8., 9., 10., 11.], dtype=float32)
  • offset=16은 16바이트에서 시작한다는 의미이다.
  • fpo의 배열 요소 크기가 4바이트이므로 배열 요소 4개를 이동한 지점에서 시작한다.

 

 

이미지 처리

  • 파이썬은 수많은 외부 패키지를 포함하므로 매우 유용하다.
  • 이러한 패키지 중, 넘파이, 사이파이 그리고 matplotlib을 이용해 음성, 동영상, 그림 또는 다양한 신호 및 이미지 등을 처리하는 알고리즘을 실행할 수 있다.
  • 파이썬에서는 공통적으로 다음 사항을 고려해 이미지를 처리한다.
    • 이미지 입력 및 출력
    • 불필요한 부분을 자르기(Cropping), 뒤집기(Filpping) 및 회전하기(Rotating) 등 기본 처리
    • 잡음 제어(De-noising), 선명하게 하기(Sharpening) 등 이미지 필터링(Filtering)
    • 이미지를 픽셀 단위의 여러 부분으로 분류하는 레이블링(Labeling)
    • 이미지 분류(Classification)
    • 특징 추출(Feature Extraction)
    • 등록(Registration)

 

넘파이와 matplotlib 활용

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> arr1 = plt.imread(‘/Users/python.png’)
>>> plt.imshow(arr1)
>>> arr1.shape
(720, 1280, 3)

>>> plt.show()

 

  • 3차원 배열 arr1의 shape는 (720, 1280, 3)이다.
    • 720*1280 픽셀이며, 3개의 색상(RGB)으로 이루어진 2차원 그림 
      • 720 : 행
      • 1280 : 열
      • 3 : 채널

 

RGB 이미지를 그레이 스케일로 변환
>>> def togray(rgb):
... fil = [0.299, 0.587, 0.144]
... return np.dot(rgb, fil)
>>> arr2 = togray(arr1)
>>> plt.imshow(arr2, cmap=’gray’)
>>> plt.show()
  • togray() 함수를 사용하여 각 픽셀에 Rx0.299 + Gx0.587 + Bx0.144를 적용해 특정 회색으로 변경한다.

 

  • matplotlib은 기본적으로 PNG 파일을 읽기만 할 수 있다.
    • 다른 이미지 형식은 Pillow 에서 옵션에 따라 지원된다.
      • Pillow는 PIL fork라고도 불리는데, PIL(Python Imaging Library)은 이미지 크기를 자르고 조정하고, 회전하고 뒤집고 색상을 변경하는 등의 기능을 가진 다양한 도구를 제공한다.

 

사이파이(SciPy) 모듈 적용

  • 사이파이 모듈의 이미지 처리 기능은 대부분 다양한 루틴(Miscellaneous Routines)이라는 scipy.misc 모듈에 유틸리티로 포함되어 있다.
  • misc 모듈에서 이미지를 처리하는 함수들은 사이파이의 독립적인 Pillow(https://python-pillow.org)와 함께 적용된다.
함수의 종류 기능
ascent() 8비트 그레이 스케일인 512x512 크기 이미지를 획득
central_diff_weights(Np[, ndiv]) Np 포인트 중앙 도함수의 비중을 반환
derivative(func, x0[, dx, n, args, order]) 어떤 지점에서 함수의 N 번째 도함수를 구함.
face([gray]) 1024x768 크기의 미국 너구리 얼굴 이미지를 획득
electrocardiogram() 1차원 신호에 대한 예제로써 심전도를 불러옴.

 

  • scipy.ndimage 패키지를 활용하면 다차원 이미지를 처리할 수 있다.
    • 이 패키지는 다차원 이미지를 처리하기 위한 필터 함수, 푸리에 필터 함수, 보간(Interpolation) 함수, 측정 관련 함수 및 형태학(Morphology) 관련 함수 들을 지원한다.

 

예제 : 미국 너구리 이미지 처리하기
  • 사이파이로부터 너구리 이미지 얻기
>>> import scipy.misc
>>> import matplotlib.pyplot as plt
>>> face = scipy.misc.face()
>>> face.shape
(768, 1024, 3)

>>> face.max(), face.min(), face.mean()
(255, 0, 110.16274388631184)

>>> face.dtype
dtype(‘uint8’)

>>> plt.gray()
>>> plt.imshow(face)
<matplotlib.image.AxesImage at 0xbaa470>

>>> plt.show()
  • face() 함수를 이용해 최대 255, 최소 0, 평균 110.16274388631184의 요소를 가지는 배열 객체인 미국너구리 이미지를 얻을 수 있다.

 

  • 미국 너구리 이미지의 원시 파일 생성 후 넘파일 배열 생성하기
>>> import imageio
>>> imageio.imwrite(‘face.png’, face)
>>> face1 = imageio.imread(‘face.png’)
>>> type(face1)
imageio.core.util.Image

>>> face1.dtype, face1.shape
(dtype(‘uint8’), (768, 1024, 3))

>>> face1.tofile(‘face1.raw’)
>>> arr = np.fromfile(‘face1.raw’, dtype=np.uint8)
>>> arr
array([121, 112, 131, ..., 92], dtype=uint8)

>>> arr.shape
(2359296,)

>>> arr.shape = (768, 1024, 3)
  • face1의 타입은 imageio.core.util.Array 이다.
    • 이는 numpy.ndarray 클래스의 서브 클래스이므로 넘파이 배열이라 할 수 있으며, 넘파이 배열은 이미지 메타데이터의 속성 정보를 포함한다.
    • 생성된 원시 파일 face1.raw 를 읽어서 넘파이 배열을 생성하면 1차원임을 알 수 있다.
    • 이것을 다시 3차원 배열로 변환한다.

 

  • 데이터 크기가 큰 경우, numpy.memmap 을 적용해 넘파이 배열 arr1을 생성할 수 있다.
>>> arr1 = np.memmap(‘face1.raw’,dtype=np.uint8, shape=(768, 1024, 3))
>>> arr1.dtype, arr1.shape
(dtype(‘uint8’), (768, 1024, 3))

 

  • matplotlib의 함수인 imshow의 적용
    • 다양한 매개 변수를 사용해 이미지를 나타낼 수 있다.
>>> import scipy.misc
>>> import matplotlib.pyplot as plt
>>> face1 = scipy.misc.face(gray=True)
>>> plt.imshow(face1, cmap=plt.cm.gray)
<matplotlib.image.AxesImage object at 0x00000204BD79DC50>

>>> plt.imshow(face1, cmap=plt.cm.gray, vmin=20, vmax=200)
<matplotlib.image.AxesImage object at 0x00000204BD79DF60>

>>> plt.axis(‘off’)
(-0.5, 1023.5, 767.5, -0.5)

>>> plt.show()
  • imshow() 함수로 각 픽셀의 색상 맵 크기를 제어할 수 있으며, 색으로 표시할 최솟값인 vmin 값은 0(그레이 스케일의 검정색)이다.
    • 기본값으로써 이미지 배열의 최솟값이다.
  • 색으로 표시할 최댓값인 vmax 값은 255(그레이 스케일의 흰색)이며, 배열의 최댓값이 기본값으로 설정된다.
  • 트루 그레이 스케일(True Gray Scale) 이미지를 원한다면 8비트 그레이 스케일 이미지를 vmin=0 그리고 vmax=255로 설정한다.

  • 앞 예제에서는 축을 'off'로 설정하였으므로 축이 표시되지 않는다.
    • 0축과 1축의 범위는 (-0.5, 1023.5, 767.5, -0.5) 이므로 show()를 실행하면 앞의 그림을 얻을 수 있다.

 

  • 그림 중 일부만 이미지로 나타낼 수도 있다.
  • 또한, 이미지 크기가 이미지 매트릭스 크기보다 크거나 작다면 보간(Interpolation)으로 픽셀 값을 조정할 수 있다.
  • 매개 변수의 보간 값은 기본값인 nearest 로 적용된다.
    • nearest
      • 이미지 해상도와 표시되는 해상도가 다르더라도 픽셀 사이의 보간 없이 이미지를 표시한다.
      •  이미지가 표시되지 않는 공간에서 가장 가까운 지점의 픽셀을 선택해 이미지를 보간한다.
>>> import scipy.misc
>>> import matplotlib.pyplot as plt
>>> face1 = scipy.misc.face(gray=True)
>>> plt.imshow(face1[0:500, 400:900], cmap=plt.cm.gray, interpolation=’nearest’)
<matplotlib.image.AxesImage object at 0x00000204BDAB0CC0>

>>> plt.show()

 

  • 너구리 그림을 뒤집고 회전해보기
    • np.flipud는 배열의 위아래를 거꾸로 뒤집는다.
    • 각 예제에 plt.show()를 실행하면 위아래가 뒤집히거나 45도 회전된 이미지를 볼 수 있다.
>>> import numpy as np
>>> import scipy.misc
>>> import scipy.ndimage
>>> import matplotlib.pyplot as plt
>>> arr = scipy.misc.face(gray=True)
>>> arr_flipud = np.flipud(arr)
>>> arr_rotate = scipy.ndimage.rotate(arr, 45)
>>> plt.imshow(arr_flipud, cmap=plt.cm.gray)
<matplotlib.image.AxesImage object at 0x00000246EF916A90>

>>> plt.imshow(arr_rotate, cmap=plt.cm.gray)
<matplotlib.image.AxesImage object at 0x000001B9DCBD5B00>

>>> plt.show()

 

728x90
그리드형(광고전용)

'In-depth Study > NumPy' 카테고리의 다른 글

[NumPy] 배열 객체 관리와 연산  (0) 2022.04.13
[NumPy] 구조화된 배열  (0) 2022.04.13
[NumPy] 넘파이 배열  (0) 2022.04.13
[NumPy] 넘파이(NumPy) 개요  (0) 2022.04.13
⚠️AdBlock이 감지되었습니다. 원할한 페이지 표시를 위해 AdBlock을 꺼주세요.⚠️


📖 Contents 📖