본문 바로가기

Python/Numpy

Numpy_01

반응형
day1_Numpy1

넘파이란?

  • Numeric + Python = Numpy(넘파이, 늄파이)
  • 수학 및 과학 연산을 위한 파이썬 패키지
  • 관련 사이트 : http://www.numpy.org
  • 리스트와의 차이점 : 하나의 데이터형만 지원
  • np.array 함수를 활용하여 ndarray 배열을 생성함
# 주의사항 : numpy 외부 모듈을 임포트하고 사용 
import numpy as np 

# 통상적으로 np로 별칭한다.

넘파이 임포트

In [1]:
import numpy as np 

넘파이 버전 확인

In [2]:
np.__version__
Out[2]:
'1.16.3'

넘파이 배열 만들기

  • np.array(리스트)
  • 리스트 형태는 실수, 정수, 문자 넘파이 배열 가능
In [4]:
arrA = [ 1, 2, 3, 4, 5 ]
print(arrA, type(arrA) )
([1, 2, 3, 4, 5], <type 'list'>)

ndArray로 변경하기

In [6]:
matrixA = np.array(arrA)
print(matrixA, type(matrixA))
(array([1, 2, 3, 4, 5]), <type 'numpy.ndarray'>)

실수형 넘파이배열

In [9]:
matrixB = np.array([0.45, 5.5, 0, 3])
matrixB
Out[9]:
array([0.45, 5.5 , 0.  , 3.  ])

문자형 넘파이배열

In [8]:
matrixC = np.array(['a', 'b', 'c'])
matrixC
Out[8]:
array(['a', 'b', 'c'], dtype='|S1')

자동 캐스팅

  • 숫자+문자 => 문자
  • 정수+실수 => 실수
  • 넘파이배열에서는 한가지 데이터형만 지원한다.
In [10]:
matrixD = np.array([1, 2, 3, 'banana', 'cat'])
matrixD
Out[10]:
array(['1', '2', '3', 'banana', 'cat'], dtype='|S11')

넘파이배열의 속성

  • 넘파이배열명.shape : 구조
  • 넘파이배열명.ndim : 차원 (ndim = number of dimension)
  • 넘파이배열명.size : 전체갯수
In [12]:
arr1d = np.array([1, 4, 5, 10 ])
arr1d
Out[12]:
array([ 1,  4,  5, 10])
In [13]:
arr1d.shape
Out[13]:
(4L,)
In [15]:
arr2d = np.array([[1, 4, 5, 10 ], [10, 30, 50, 60]])
arr2d
Out[15]:
array([[ 1,  4,  5, 10],
       [10, 30, 50, 60]])
In [16]:
arr2d.shape
Out[16]:
(2L, 4L)
In [18]:
arr2d.ndim
Out[18]:
2
In [19]:
arr2d.size
Out[19]:
8

초기값을 0 또는 1로 지정하기

  • np.zeros(데이터갯수)
  • np.zeros([행수,열수])
  • np.ones(데이터갯수)
  • np.ones([행수,열수])
In [20]:
arr1 = np.zeros(10)
arr1
Out[20]:
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
In [21]:
arr2 = np.zeros([2,2])
arr2
Out[21]:
array([[0., 0.],
       [0., 0.]])
In [22]:
arr3 = np.ones(10)
arr3
Out[22]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
In [23]:
arr4 = np.ones([2,2])
arr4
Out[23]:
array([[1., 1.],
       [1., 1.]])

np.empty()로 초기값 지정하기

  • np.empty(숫자)
  • np.empty((행수,열수))
  • 초기값이 변형된다.
In [26]:
arr5 = np.empty([2,2])
arr5
Out[26]:
array([[1., 1.],
       [1., 1.]])
In [37]:
arr6 = np.empty(10)
arr6
Out[37]:
array([1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])

초기값을 1씩 증가되는 숫자값으로 지정하기

  • np.arange(start,end,step)
  • end 숫자값을 제외
  • start ~ end-1 까지 step 값만큼 증가해서 생성
  • 넘파이배열 생성

range(초기값, 마지막값, 단계)

In [38]:
range(10)
Out[38]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
In [39]:
range(1,11)
Out[39]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [40]:
range(0,11,2)
Out[40]:
[0, 2, 4, 6, 8, 10]
In [41]:
for i in range(1,11):
    print(i)
1
2
3
4
5
6
7
8
9
10

자동증가되는 ndArray

In [42]:
np.arange(20)
Out[42]:
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,
       17, 18, 19])
In [43]:
np.arange(1,30,2)
Out[43]:
array([ 1,  3,  5,  7,  9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29])
In [44]:
np.arange(0,30,5)
Out[44]:
array([ 0,  5, 10, 15, 20, 25])

Numpy 배열의 구조 변경

  • 배열명.reshape(행수, 열수)
  • Element의 객수는 동일하고 구조 변경
  • 배열명.reshape(-1,행안의아이템수) : size를기반으로 row 개수 선정

2차원 배열 만들어 구조 변경하기


- np.array([[1,2,3,4,5],[6,7,8,9,10]])
- np.arange(1,11).reshape(2,5)
In [46]:
np.arange(1,11)
Out[46]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
In [47]:
np.arange(1,11).reshape(2,5)
Out[47]:
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10]])

배열명.reshape(-1,행안의아이템수)

  • 배열의 전체행수는? 전체아이템수/아이템수
In [48]:
myArray = np.array([10,20,40,90,100,20])
myArray
Out[48]:
array([ 10,  20,  40,  90, 100,  20])
In [49]:
# 한행에 2개씩 구성
myArray.reshape(-1,2)
Out[49]:
array([[ 10,  20],
       [ 40,  90],
       [100,  20]])
In [50]:
# 한행에 3개씩 구성
myArray.reshape(-1,3)
Out[50]:
array([[ 10,  20,  40],
       [ 90, 100,  20]])

flatten()으로 1차원 배열로 변경하기

  • 넘파이배열.flatten()
In [51]:
arr2d = np.array([[1,4,5,6],[56,23,45,67],[8,4,6,10]])
arr2d
Out[51]:
array([[ 1,  4,  5,  6],
       [56, 23, 45, 67],
       [ 8,  4,  6, 10]])
In [52]:
arr2d.flatten()
Out[52]:
array([ 1,  4,  5,  6, 56, 23, 45, 67,  8,  4,  6, 10])

데이타형 표시와 변경

  • type(변수/집합형...) : 데이터형 표시
  • 배열명.dtype : data type
  • 배열명.astype(데이터형) : 데이터형변환 => 캐스팅
    데이터형 : float / int / np.str
In [55]:
# 정수형 넘파이 배열
arr1 = np.array([1,2,3,4,5])
In [56]:
# 배열명 전체의 데이터형 표시 
type(arr1)
Out[56]:
numpy.ndarray
In [57]:
# 배열을 구성하는 아이템의 데이터형 표시 
arr1.dtype
Out[57]:
dtype('int32')
In [58]:
# 실수형 넘파이 배열
arr2 = np.array([1.1, 2.4 , 3, 4, 5])
arr2.dtype
Out[58]:
dtype('float64')

정수형 => 실수형 배열로 변경

In [62]:
arr1 = np.array([1,2,3,4])
arr1
Out[62]:
array([1, 2, 3, 4])
In [63]:
arr1.dtype
Out[63]:
dtype('int32')
In [64]:
arr2 = arr1.astype(float)
arr2
Out[64]:
array([1., 2., 3., 4.])
In [65]:
arr2.dtype
Out[65]:
dtype('float64')

행열의 연산

  • 같은 위치의 요소끼리 사칙 연산
In [69]:
arr1 = np.arange(20,26)
arr2 = np.arange(10,16)
print(arr1, arr2)
(array([20, 21, 22, 23, 24, 25]), array([10, 11, 12, 13, 14, 15]))
In [70]:
arr1 + arr2
Out[70]:
array([30, 32, 34, 36, 38, 40])
In [71]:
arr1 - arr2
Out[71]:
array([10, 10, 10, 10, 10, 10])
In [72]:
arr1 * arr2
Out[72]:
array([200, 231, 264, 299, 336, 375])
In [75]:
arr1 / arr2
Out[75]:
array([2, 1, 1, 1, 1, 1])

행렬의 인덱싱과 슬라이싱 - 1차원

  • 리스트와 비슷
  • 배열이름[인덱스번호]
  • 배열이름[start:end]
In [77]:
animals = np.array([100, 200, 400, 6, 90])
animals 
Out[77]:
array([100, 200, 400,   6,  90])
In [78]:
animals[0]
Out[78]:
100
In [79]:
animals[-1]
Out[79]:
90
In [80]:
animals[0:2]
Out[80]:
array([100, 200])

행렬의 인덱싱과 슬라이싱 - 2차원

  • 리스트와 비슷
  • 배열이름[행, 열] / 배열이름[행][열]
  • 배열이름[:,:] 전체출력
  • 배열이름[start:end, start:end]
In [82]:
myArray = np.arange(1,31)
myArray
Out[82]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30])
In [90]:
myArray2 = myArray.reshape(5,6)
myArray2
Out[90]:
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12],
       [13, 14, 15, 16, 17, 18],
       [19, 20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29, 30]])
In [91]:
myArray2[0,5]
Out[91]:
6
In [93]:
myArray2[0][5]
Out[93]:
6
In [94]:
# 1열 출력하기 
myArray2[:, 0]
Out[94]:
array([ 1,  7, 13, 19, 25])
In [96]:
# 1행 출력하기 
myArray2[0,:]
Out[96]:
array([1, 2, 3, 4, 5, 6])
In [97]:
# 전체 출력하기 
myArray2[:,:]
Out[97]:
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12],
       [13, 14, 15, 16, 17, 18],
       [19, 20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29, 30]])
In [98]:
# 1,2행 출력하기 
myArray2[0:2,:]
Out[98]:
array([[ 1,  2,  3,  4,  5,  6],
       [ 7,  8,  9, 10, 11, 12]])
In [100]:
# 2~4열  출력하기 
myArray2[:,1:4]
Out[100]:
array([[ 2,  3,  4],
       [ 8,  9, 10],
       [14, 15, 16],
       [20, 21, 22],
       [26, 27, 28]])
In [102]:
# 3~5행에서 3~5열 
myArray2[2:6,3:6]
Out[102]:
array([[16, 17, 18],
       [22, 23, 24],
       [28, 29, 30]])

::를 이용한 슬라이싱

  • 배열이름[start:end:step]
  • 배열이름[start:end:step, [start:end:step]
In [104]:
# 1차원 배열 선언 
arr1 = np.arange(1,11)
arr1
Out[104]:
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])
In [105]:
# 홀수번째 출력
arr1[::2]
Out[105]:
array([1, 3, 5, 7, 9])
In [107]:
# 짝수번째 출력
arr1[1::2]
Out[107]:
array([ 2,  4,  6,  8, 10])
In [108]:
# 0~4 인덱스중 홀수번째 
arr1[0:5:2]
Out[108]:
array([1, 3, 5])
In [111]:
# 2차원 넘파이 배열 선언 
arr2 = np.arange(1,21).reshape(4,5)
arr2
Out[111]:
array([[ 1,  2,  3,  4,  5],
       [ 6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15],
       [16, 17, 18, 19, 20]])
In [112]:
# 홀수번째 행 추출
arr2[::2,:]
Out[112]:
array([[ 1,  2,  3,  4,  5],
       [11, 12, 13, 14, 15]])
In [113]:
# 홀수번째 컬럼 추출
arr2[:,::2]
Out[113]:
array([[ 1,  3,  5],
       [ 6,  8, 10],
       [11, 13, 15],
       [16, 18, 20]])

퀴즈

1~15로 구성된 넘파이 배열을 3행5열로 구성하고 1,3,5열만 출력하여라

array([[ 1,  3,  5],
       [ 6,  8, 10],
       [11, 13, 15]])

퀴즈

1~15로 구성된 넘파이 배열을 3행5열로 구성하고 1행1열, 1행4열, 3행1열, 3행4열만 출력하도록 슬라이싱하여라

array([[ 1,  4],
       [11, 14]])
In [ ]:
 
In [ ]:
 
반응형

'Python > Numpy' 카테고리의 다른 글

Numpy_04  (0) 2019.08.11
Numpy_03  (0) 2019.08.11
Numpy_02  (2) 2019.08.11