생각하는 감쟈

[Python] 2-1) Jupyter 기초 본문

Language/Python

[Python] 2-1) Jupyter 기초

생각하는 감쟈🥔 2023. 3. 22. 10:21

 

 

 

 

 7일차 (23.03.21)

 

 

/Jupyter

 

실행 차이점)

ctrl + enter : 출력은 나오는데 새로운 셀이 추가가 안됨

alt + enter : 실행결과 나오면서 무조건 새로운 in[]셀이 추가

shift + enter : 밑에 새롭게 셀이 추가 ,밑에 셀이 있을 경우 안 생김 이동만 됨

셀 위치 변경 화살표로 이동

 

주석 처리 방법)

cell - markdown : 주석 입력

# ,## - # 사용할수록 글씨 작아짐

> - 들여쓰기(?)

tap -

 

NUmPy(Numerical Python)

1 제공

빠르고 효율적인 다차원 배열 객체 ndarray

배열 원소를 다루거나 배열 간의 수학 계산을 수행하는 함수

디스크로부터 배열 기반의 데이터를 읽거나 쓸수 있는 도구

파이썬 확장과 c, c++ 코드에서 Numpy의 자료구조에 접근하고 계산기능을 사용할 수 있도록 해주는 a api

 

2 대용량 데이터 배열으 효율적으로 다룰수 있음

내부적으로 데이터를 다른 내장 파이썬 객체와 분리된 연속된 메모리 블록에 저장

내장 파이썬 연속된 자료형들보다 더 적은 메모리 사용

파이썬 반복문을 사용하지 않고 전체 배열의 복잡한 게산 수행

 

//시간 구하기
import numpy as np
my_arr = np.arange(1000000)
my_list = list(range(1000000))

%time for _ in range(10) : my_arr2 = my_arr *2
%time for _ in range(10) : my_list1 = [x*2 for x in my_list]
 

 

data1 결과 출력

data1 = np.random.randn(6)
data1
 
array([ 1.57022334, -0.8714609 ,  0.0933879 ,  0.44843192,  0.8857358 ,
        0.51839122])
 

2,3 2차원으로 배열 출력

data = np.random.randn(2,3)
data
 
array([[ 0.02403071,  0.13125449,  0.11574168],
       [ 0.42478843,  1.24618936, -0.89918944]])
​
 

곱해도 data 자체값은 변하지 않음

배열이여서 사칙연산 가능 리스트는 불가능 반복문 사용해줘야 함

 

data * 10
 
array([[ 1.52392701, -7.18952901,  7.2889993 ],
       [ 7.40316166, 10.66900725,  5.17644738]])
 
data + data
 
array([[ 0.3047854 , -1.4379058 ,  1.45779986],
       [ 1.48063233,  2.13380145,  1.03528948]])
 
data.shape
 
(2, 3)
 
data.dtype
 
dtype('float64')
 

ndarray : N차원 배열 객체

1. list 의 차이점

list는 여러 타입을 지원하지만 ndarry는 하나의 데이터 타입만 가능

ndarray는 알아서 하나의 타입으로 형변환

C의 arra와 동일

 

2. 생성하기

np.arrary함수를 이용하여 ndarray 형태로 변환

a = [1,2,3,4,5]

a_ndarray = np.array(a,int)

 

3. 파이썬은 배열 자료형을 제공하지 않으므로

배열의 표준 패키지는 numpy이며 배열 자료구조 ndarray를 제공

 

4. 벡터화 연산을 통해 간단한 코드로 복잡한 선형대수 연산

 

5. a_ndarray.shape #크기반환

a_ndarray.dtype #타입반환

a_ndarray.ndim #몇차원인지 반환

 

6. 소수점까지 있어야 정확한 Y값을 예측가능하므로 float사용

a_ndarray = np.array(a, dtype = np.float32)

 

data1 = [2, 3.3, 9, 3, 0]
arr1 = np.array(data1)
arr1
 
array([2. , 3.3, 9. , 3. , 0. ])
 

+배열은 자료형이 다 같아야하므로 - float타입으로 변경 됨

 


 

arr 구분)

  • 0열 선택0열 다음에 열 추가
  • 1열 선택1열 다음에 열 추가
  • 2열 선택2열 다음에 열 추가
  • 0행 선택0행 다음에 행 추가
1차원 arr
- len(arr1) = 값(길이)



2차원 arr2
- len(arr2) = 행 값
- len(arr[0]) = '0인덱스 행의' 열

3차원 arr3
len(arr3) = 차원 값
len(arr3[0]) = 차원의 행값
len(arr3[0],[0]) = 행의 열값
1차원 arr

- len(arr1) = 값

 

2차원 arr2

- len(arr2) = 행 값

- len(arr[0]) = '0인덱스 행의' 열

 

3차원 arr3

len(arr3) = 차원 값

len(arr3[0]) = 차원의 행값

len(arr3[0],[0]) = 헹의 열값

 

 

 

data2 = [[1,2,3,4],[5,6,7,8]]
arr2 = np.array(data2)
arr2
 
array([[1, 2, 3, 4],
       [5, 6, 7, 8]])
 
len(arr2)
 

결과 값 -> 2 : 2개의 행

len(arr2[0])
 

결과 값 -> 4 : 열의 개수

arr2.ndim
 

결과 값 -> 2 : 차원 구하기 2차원

arr2.shape
 

결과 값 -> (2, 4) : 행열 구하기

 

 


 

zeros : 0으로 가득찬 array 생성

np.zeros(10) 
 
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
 
np.zeros((2,5))
 
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])
 
a=np.zeros((2,3,4))
a
 
array([[[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]],

       [[0., 0., 0., 0.],
        [0., 0., 0., 0.],
        [0., 0., 0., 0.]]])
 
len(a)
 

결과값 -> 2 : 차원 개수

len(a[0])
 

결과값 -> 3 : 행

len(a[0][0])
 

결과값 -> 4 : 열

a.dtype
 

결과값 -> dtype('float64') :타입을 설정하지 않어서 float로 나옴


ance : 1로 가득찬 arrary

np.ones(10, dtype=np.int8)
 
array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int8)
 
np.ones((2,4))
 
array([[1., 1., 1., 1.],
       [1., 1., 1., 1.]])       int 설정 안 해줌
 

empty : 초기화되지 않은 값으로 생성

np.empty(10, dtype=np.int8)
 
array([  0, -22,  59,  81, 113,   1,   0,   0,   0,   0], dtype=int8)
 

something_like : _like는 지정된 arrary의 shape 크기만큼 지정된 값으로 채원 array 반환

 

 

test_matrix= np.arange(30).reshape(5,6)
test_matrix
 
array([[ 0,  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]])
 

arange는 0부터 29까지 출력 하소 reshape(5,6) 2차원으로 다시 정렬

np.ones_like(test_matrix)
 
array([[1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1],
       [1, 1, 1, 1, 1, 1]])
 
np.zeros_like(test_matrix)
 
array([[0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0]])
 

 


 

range(10) : 파이썬 함수로 정수를 리스트로 반환 (0~9까지 출력)

np.arange(1, 10, 0.5) : 정수, 실수를 배열로 반환 ((1~9까지 0.5씩)

 

list

list_a = list(range(10))
list_a
 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 

배열

np.arange(1,10,0.5)
 
array([1. , 1.5, 2. , 2.5, 3. , 3.5, 4. , 4.5, 5. , 5.5, 6. , 6.5, 7. ,
       7.5, 8. , 8.5, 9. , 9.5])
 
arr1 = np.array([1,2,3], dtype = np.float64)
arr2 = np.array([1,2,3], dtype = np.int32)

arr1.dtype
arr2.dtype
 
dtype('float64')     arr1
dtype('int32')       arr2
 

타입변환

float_arr = arr2.astype(np.float64)
float_arr.dtype
 
dtype('float64') 
 
//list -> array로 바꾸기
arr = np.array([1.2, 7.2, -2.4, 10.5])
arr
 
array([ 1.2,  7.2, -2.4, 10.5])
 
arr.astype(np.int32)    타입변경
 
array([ 1,  7, -2, 10])
 
int_arr = np.arange(10)
float_arr = np.array([.12, .62, .23], dtype = np.float64)

int_arr.astype(float_arr.dtype)
float_arr.dtype
 
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
dtype('float64')
 

백터와 연산 : 배열의 원소에 대한 반복연산을 하나의 명령어로 처리

data = [0,1,2,3,4,5,6,7,8,9]
answer = []
for i in data:
    answer.append(2*i)
answer
 
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
 
x = np.array(data)
x
 
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
 
x*2
 
array([ 0,  2,  4,  6,  8, 10, 12, 14, 16, 18])
 
data * 2
 
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
 

리스트 객체에 정수를 곱하면 객체의 크기가 정수배 만큼 증가

- 배열에 넣어서 연산하면 값에 *2씩

- 배열이 아닌 리스트에 *2를 하면 데이터를 2번 출력

 

 


 

비교연산, 논리연산, 수학연산

arr = np.array([[1.,2.,3.],[4.,5.,6.]])
arr
 
array([[1., 2., 3.],
       [4., 5., 6.]])
 
len(arr)
 

결과값 ->2

 

len(arr[0])
 

결과 -> 3

arr * arr
 
array([[ 1.,  4.,  9.],
       [16., 25., 36.]])
 
arr-arr
 
array([[0., 0., 0.],
       [0., 0., 0.]])
 
1/arr
 
array([[1.        , 0.5       , 0.33333333],
       [0.25      , 0.2       , 0.16666667]])
 
arr ** 0.5
 
array([[1.        , 1.41421356, 1.73205081],
       [2.        , 2.23606798, 2.44948974]])
 
arr2 = np.array([[0., 4.,1.],[7.,2.,12.]])
arr2
 
array([[ 0.,  4.,  1.],
       [ 7.,  2., 12.]])
 
arr2>arr
 
array([[False,  True, False],
       [ True, False,  True]])
 
a = np.array([1,2,3])
b = np.array([10,20,30])

a == 2
 
array([False,  True, False])
 
(a == 2) & (b>10)
 
array([False,  True, False])
 

결과가 배열마다 비교해서 결과 값이 여러개 나옴

배열 인덱스 끼리 연산 해줌

#all :배열의 모든 원소가 같은지 확인
np.all(a == b)
 
False    
 

비교값도 다 맞아야하고 비교값에 대한 결과 값도 다 충족할 때

 


연습문제)

 

다음과 같은 행렬을 만드시오 [10,20,30] [40,50,60]

 

#1
a1 = np.array([[10,20,30],[40,50,60]])
a1
 
#2
b1 = np.arange(10,70,10).reshape(2,3)
b1
 
array([[10, 20, 30],
       [40, 50, 60]])
 

인덱싱, 슬라이싱

인덱싱 - 특정 위치 인덱스 출력

슬라이싱 - 범위 설정 인덱스 출력

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

결과 => 5 : 0부터 5번째 값

arr[-1]
 

결과 => 9: 뒤에사 -1자리 출력

arr[5:8]
 

결과 => 5,6,7 : 5부터 8이전 까지 출력

arr[5:8]=12
arr
 
array([ 0,  1,  2,  3,  4, 12, 12, 12,  8,  9])
 

데이터는 복사되지 않고 뷰에대한 변경은 그대로 원본에 적용 됨

arr_slice = arr[5:8]
arr_slice
 
array([12, 12, 12])
 
arr_slice[1]=12345
 
arr_slice
 
array([   12, 12345,    12])
 
arr
 
array([    0,     1,     2,     3,     4,    12, 12345,    12,     8,
           9])
 
arr_slice[:]=64
arr
 
array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])
 

Numpy는 대용량의 데이터 처리를 염두에 설계되었으므로 복사하면 성능과 메모리에 문제가 생김

복사되는게 아니므로 복사가 하고싶다면 copy()

copy_arr=arr[5:8].copy()
copy_arr
 
array([   12, 12345,    12])
 
copy_arr[:]=10
copy_arr
 
array([10, 10, 10])
 

#1차원
arr
 
array([ 0,  1,  2,  3,  4, 64, 64, 64,  8,  9])
 
#2차원
arr2d = np.array([[1,2,3],[4,5,6],[7,8,9]])
arr2d[2]
 
array([7, 8, 9])
 
arr2d[0,2]
 
3
 
#3차원
arr3d =  np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d
 
arr3d =  np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d
arr3d =  np.array([[[1,2,3],[4,5,6]],[[7,8,9],[10,11,12]]])
arr3d
array([[[ 1,  2,  3],
        [ 4,  5,  6]],

       [[ 7,  8,  9],
        [10, 11, 12]]])
 
arr3d[0]
 
array([[1, 2, 3],
       [4, 5, 6]])
 
arr3d.shape
 
(2, 2, 3)
 
old_value = arr3d[0].copy()
arr3d[0]=41
arr3d
 
array([[[41, 41, 41],
        [41, 41, 41]],

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

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

연습문제 2

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

1. 이 행렬애서 값 7을 인덱싱한다

m[1][2]
 

2. 이 행렬에서 값 14를 인덱싱한다

m[2][4]
 

3. 이 행렬애서 배열 [6,7]을 슬라이싱한다.

m[1,1:3]
 

4. 이 행렬애서 배열 [7,12]을 슬라이싱한다.

m[1:,2]
 

5. 이 행렬애서 배열 [[3,4],[8,9]]을 슬라이싱한다.

m[:2,3:]
 

불리언값으로 선택

- 인덱스 배열의 원소가 true, false로 이루어짐

- 배열의 크기가 원래 ndarray 객체 크기와 같아댜함

a= np.array([0,1,2,3,4,5,6,7,8,9])
idx = np.array([True, False,True, False,True, False,
                True, False,True, False])
a[idx]
 
array([0, 2, 4, 6, 8])
 
a%2
 
array([0, 1, 0, 1, 0, 1, 0, 1, 0, 1], dtype=int32)
 
a%2 == 0
 
array([ True, False,  True, False,  True, False,  True, False,  True,
       False])
 
a[a%2==0]
 
array([0, 2, 4, 6, 8])
 
names = np.array(['bob','job','will','bob','will','joe','joe'])
data = np.random.randn(7,4)
names
 
array(['bob', 'job', 'will', 'bob', 'will', 'joe', 'joe'], dtype='<U4')
​
 
data
 
array([[ 0.49658682, -0.49307438, -0.01707738,  1.2938424 ],
       [-0.14187906, -1.61501713,  0.71566874,  1.74687225],
       [ 1.64421097, -1.50169749, -1.22634295, -0.19370482],
       [ 0.00932732,  1.05577434,  0.78641164,  0.96078302],
       [-0.51055449, -0.140159  ,  0.74721061,  1.02268137],
       [ 2.18602266, -0.17206536, -0.84613705,  0.44909032],
       [ 2.32278243,  1.028269  , -0.1188879 ,  1.11725799]])
 
names =='bob'
 
array([ True, False, False,  True, False, False, False])
 
data[names == 'bob']
 
array([[ 0.49658682, -0.49307438, -0.01707738,  1.2938424 ],
       [ 0.00932732,  1.05577434,  0.78641164,  0.96078302]])
 
data[names == 'bob', 2:]
 
array([[-0.01707738,  1.2938424 ],
       [ 0.78641164,  0.96078302]])
 
data[names =='bob', 3]
 
array([1.2938424 , 0.96078302])
 
names !='bob'
 
array([False,  True,  True, False,  True,  True,  True])
 
data[~(names =='bob')]
 
array([[-0.14187906, -1.61501713,  0.71566874,  1.74687225],
       [ 1.64421097, -1.50169749, -1.22634295, -0.19370482],
       [-0.51055449, -0.140159  ,  0.74721061,  1.02268137],
       [ 2.18602266, -0.17206536, -0.84613705,  0.44909032],
       [ 2.32278243,  1.028269  , -0.1188879 ,  1.11725799]])
 
cond = names =='bob'
data[~cond]
 
array([[-0.14187906, -1.61501713,  0.71566874,  1.74687225],
       [ 1.64421097, -1.50169749, -1.22634295, -0.19370482],
       [-0.51055449, -0.140159  ,  0.74721061,  1.02268137],
       [ 2.18602266, -0.17206536, -0.84613705,  0.44909032],
       [ 2.32278243,  1.028269  , -0.1188879 ,  1.11725799]])
 
mask = (names =='bob')|(names == 'will')
mask
 
array([ True, False,  True,  True,  True, False, False])
 
data[mask]
 
array([[ 0.49658682, -0.49307438, -0.01707738,  1.2938424 ],
       [ 1.64421097, -1.50169749, -1.22634295, -0.19370482],
       [ 0.00932732,  1.05577434,  0.78641164,  0.96078302],
       [-0.51055449, -0.140159  ,  0.74721061,  1.02268137]])
 
data[data<0] = 0
data
 
array([[0.49658682, 0.        , 0.        , 1.2938424 ],
       [0.        , 0.        , 0.71566874, 1.74687225],
       [1.64421097, 0.        , 0.        , 0.        ],
       [0.00932732, 1.05577434, 0.78641164, 0.96078302],
       [0.        , 0.        , 0.74721061, 1.02268137],
       [2.18602266, 0.        , 0.        , 0.44909032],
       [2.32278243, 1.028269  , 0.        , 1.11725799]])
 
data[names != 'joe']=7
data
 
array([[7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [7.        , 7.        , 7.        , 7.        ],
       [2.18602266, 0.        , 0.        , 0.44909032],
       [2.32278243, 1.028269  , 0.        , 1.11725799]])
 
x = np.arange(1,21)
x
 
array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,
       18, 19, 20])
 
  1. 배열에서 3의 배수를 찾아라
x[x % 3 == 0] 
 
array([ 3,  6,  9, 12, 15, 18])
 

2. 배열에서 4로 나누면 1이 남는 수를 찾아라

x[x % 4 == 1] 
 
array([ 1,  5,  9, 13, 17])
 

3. 배열에서 3으로 나누면 나누어지고 4로 나누면 1이 남는 수를 찾아라

x[(x % 3 == 0) & (x % 4 ==1)] 
 
array([9])
 

 

 

와 오늘 내용 왜케 많아!

 

 

 

#ABC부트캠프 #부트캠프 #유클리드소프트 #파이썬 #python #고용노동부 #한국산업인력공단

 

 

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

[Python] 2-3) Pandas Series  (1) 2023.03.27
[Python] 2-2) Jupyter Numpy  (0) 2023.03.23
[Python] 타자 게임 만들기  (2) 2023.03.20
[Python] 주말 코딩 연습  (1) 2023.03.20
[Python] 4) 함수_모듈_파일  (0) 2023.03.19
Comments