상세 컨텐츠

본문 제목

01_넘파이

Python/3.데이터 분석

by 일동일동 2023. 3. 5. 09:21

본문

728x90
반응형

1. Numpy

  • 수학, 과학 계산용 패키지
  • 성능: ndarray가 파이썬의 list보다 빠름
  • 메모리 사이즈: ndarray가 파이썬의 list보다 적은 메모리를 사용
!pip install numpy

Looking in indexes: https://pypi.org/simple, https://us-python.pkg.dev/colab-wheels/public/simple/ Requirement already satisfied: numpy in /usr/local/lib/python3.8/dist-packages (1.21.6)

 

import numpy as np
np

<module 'numpy' from '/usr/local/lib/python3.8/dist-packages/numpy/__init__.py'>

1-1. array(배열)

  • 여러값들의 그룹
list1 = [1, 2, 3, 4]
list2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
print(list1)
print(type(list1))

print(list2)
print(type(list1))

[1, 2, 3, 4]
<class 'list'>
[[1, 2, 3, 4], [5, 6, 7, 8]]
<class 'list'>

arr = np.array([1, 2, 3, 4])
print(arr)
print(type(arr)) # < class 'numpy.ndarray'> = n dimension array

[1 2 3 4]
<class 'numpy.ndarray'>

# 리스트를 ndarray로 생성하는 방법
arr1 = np.array(list1)
arr2 = np.array(list2)

print(arr1)
print(type(arr1))

print(arr2)
print(type(arr2))

[1 2 3 4]
<class 'numpy.ndarray'>
[[1 2 3 4]
 [5 6 7 8]]
<class 'numpy.ndarray'>

1-2. array의 data 타입

  • ndarray는 list와 다르게 단일 데이터 타입만 허용
list1 = [1, 3.14, 'Python', '🐇', True]
list1

[1, 3.14, 'Python', '🐇', True]

list1[3]

🐇

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

array([1, 2, 3, 4])

arr2 = np.array([1, 2, 3.14, 4])
arr2
arr3 = np.array([1, 2, 3.14, True])
arr3

array([1. , 2. , 3.14, 1. ])

arr4 = np.array([1, 2, 3.14, True, 'apple'])
arr4

array(['1', '2', '3.14', 'True', 'apple'], dtype='<U32')

arr3 = np.array([1, 2, 3.14, True], dtype=int)
arr3

array([1, 2, 3, 1])

arr4 = np.array([1, 2, 3.14, True, '1234'], dtype=int)
arr4

---------------------------------------------------------------------------
NameError                                 Traceback (most recent call last)
<ipython-input-18-10df8e8c591c> in <module>
----> 1 arr4 = np.array([1, 2, 3.14, Ture, '1234'], dtype=int)
      2 arr4

NameError: name 'Ture' is not defined

 

arr4 = np.array([1, 2, 3.14, True, '1234'], dtype=int)
arr4

array([ 1, 2, 3, 1, 1234])

 

1-3. 인덱싱과 슬라이싱

  • 배열의 부분 선택
arr1 = np.array(['😁','🤣','😃','🍅','🍔'])
arr1.shape

(5,)

print(arr1[0])
print(arr1[4])
print(arr1[-1])
print(arr1[-2])

😁
🍔
🍔
🍅

print(arr1[0:3])
print(arr1[2:])
print(arr1[:3])

['😁' '🤣' '😃']
['😃' '🍅' '🍔']
['😁' '🤣' '😃']

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

(3, 4)

arr2d[0, 2]

3

arr2d[2, 1]

10

# 0행을 가져오기
print(arr2d[0])
print(arr2d[0,])
print(arr2d[0,:])

[1 2 3 4]
[1 2 3 4]
[1 2 3 4]

# 0열을 가져오기
print(arr2d[:, 0])

[1 5 9]

arr2d[:2, :]

array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

arr2d[:2, 2:]

array([[3, 4],
       [7, 8]])

1-4. Fancy 인덱싱

  • 범위가 아닌 특정 index의 집합의 값을 선택하여 추출하고 싶을 때 활용
arr1 = np.array([10, 23, 2, 6, 90, 85, 32, 66, 80])
idx = [1, 4, 6]
arr1[idx]

array([23, 90, 32])

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

array([[1, 2, 3, 4],
       [5, 6, 7, 8]])

1-5. Boolean 인덱싱

  • 조건 필터링을 통하여 Boolean 값을 이용한 색인
arr1 = np.array(['😁','🤣','😃','🍅','🍔'])
selValue = [True, True, False, False, True]
arr1[selValue]

array(['😁', '🤣', '🍔'], dtype='<U1')

selValue = [True, True, True, True]
arr1[selValue]  # IndexError: boolean index did not match indexed array along dimension 0; dimension is 5 but corresponding boolean dimension is 4
arr2d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
arr2d > 7

array([[False, False, False, False],
       [False, False, False,  True],
       [ True,  True,  True,  True]])

arr2d < 5

array([[ True,  True,  True,  True],
       [False, False, False, False],
       [False, False, False, False]])

arr2d[arr2d > 7]

array([ 8,  9, 10, 11, 12])

arr2d[arr2d < 5]

array([1, 2, 3, 4])

2. 행렬 연산

2-1. 연산자

# 덧셈 연산
a = np.array([[1, 2, 3], [2, 3, 4]])
b = np.array([[1, 2, 3], [2, 3, 4]])
print(a.shape)
print(b.shape)

(2, 3)
(2, 3)

# shape가 같아야 함
# 같은 position끼리 연산

a + b
a = np.array([[1, 2, 3], [2, 3, 4]])
b = np.array([[3, 4], [1, 2]])
print(a. shape)
print(b. shape)

(2, 3)
(2, 2)

a + b # ValueError: operands could not be broadcast together with shapes (2,3) (2,2)
# 뺄셈 연산
a = np.array([[1, 2, 3], [2, 3, 4]])
b = np.array([[1, 2, 3], [2, 3, 4]])

a - b

array([[0, 0, 0],
       [0, 0, 0]])

# 나눗셈 연산
a = np.array([[1, 2, 3], [2, 3, 4]])
b = np.array([[4, 5, 6], [1, 2, 3]])

a / b

array([[0.25      , 0.4       , 0.5       ],
       [2.        , 1.5       , 1.33333333]])

# 내적(dot product)
# 맞닿는 shape가 같아야 함
# 결과 행렬은 떨어져있는 shape의 형태와 같아야 함
a = np.array([[1, 2, 3], [1, 2, 3], [2, 3, 4]])
b = np.array([[1, 2], [3, 4], [5, 6]])

# 맞닿는 shape가 같아야함 ex ) (3,3) (3,2) = (3,2) 내부 맞닿는 3이 같아야함

'''
1 2 3       1 2
1 2 3       3 4
2 3 4       5 6
'''
a.shape, b.shape

((3, 3), (3, 2))

print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((1*1 + 2*3 + 3*5), (1*2 + 2*4 + 3*6))
print((2*1 + 3*3 + 4*5), (2*2 + 3*4 + 4*6))

22 28
22 28
31 40

np.dot(a, b)

array([[22, 28],
       [22, 28],
       [31, 40]])

2-2. arange

  • 순차적인 값을 생성할 때 사용
arr1 = range(1, 11)
arr1

range(1, 11)

for i in arr1:
    print(i, end=' ')

1 2 3 4 5 6 7 8 9 10

arr2 = np.arange(1, 11)
arr2

array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

for i in arr2:
    print(i, end=' ')

1 2 3 4 5 6 7 8 9 10

 

2-3. sort

arr1 = np.array([1, 10, 5, 7, 2, 4, 3, 6, 8, 9])
arr1

array([ 1, 10, 5, 7, 2, 4, 3, 6, 8, 9])

np.sort(arr1) # 기본값은 오름차순

array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

np.sort(arr1)[::-1] # 내림차순

array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1])

li1 = [1, 10, 5, 7, 2, 4, 3, 6, 8, 9]
li1.sort()
li1 # 정렬된 결과를 유지

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

result = np.sort(arr1)
result

array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10])

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

(3, 4)

#행 정렬
np. sort(arr2d, axis=0) # axis = 0: 행

array([[ 3,  1,  4,  2],
       [ 5,  6,  7,  8],
       [11, 10, 12,  9]])

#열 정렬
np.sort(arr2d, axis=1) # axis = 0: 열

array([[ 9, 10, 11, 12],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])

# 축의 마지막 방향
np.sort(arr2d, axis=-1) # axis = -1: 축이 많을 경우 마지막 축의 값을 설정

array([[ 9, 10, 11, 12],
       [ 1,  2,  3,  4],
       [ 5,  6,  7,  8]])

2-4. 숫자의 단일 연산

a = np.array([[1, 2, 3], [4, 5, 6]])
b = np.array([[3, 3, 3], [3, 3, 3]])
a + b

array([[4, 5, 6],
       [7, 8, 9]])

a + 3

array([[4, 5, 6],
       [7, 8, 9]])

a - 3

array([[-2, -1,  0],
       [ 1,  2,  3]])

a * 3

array([[ 3,  6,  9],
       [12, 15, 18]])

a / 3

array([[0.33333333, 0.66666667, 1.        ],
       [1.33333333, 1.66666667, 2.        ]])

반응형