![]() |
Numpy Basic
1 Advanced Python CH4 - Numpy Basic
2 Array & Vectorized Computation
랜덤 시드 : 숫자 지정시 동일 난수 생성
import numpy as np
12345) np.random.seed(
그림 크기 지정
import matplotlib.pyplot as plt
'figure', figsize = (10,6)) plt.rc(
Numpy 배열 숫자들을 소수점 이하 4자리까지 표시
=4, suppress=True) np.set_printoptions(precision
0부터 999999까지의 숫자로 이루어진 NumPy 배열
= np.arange(1000000)
my_arr my_arr
array([ 0, 1, 2, ..., 999997, 999998, 999999])
0부터 999999까지의 숫자로 이루어진 리스트를 생성
= list(range(1000000)) my_list
Numpy배열이 list형태보다 계산이 더 빠름
%time for _ in range(10): my_arr2 = my_arr*2
%time for _ in range(10): my_list2 = [x*2 for x in my_list]
CPU times: total: 31.2 ms
Wall time: 20.9 ms
CPU times: total: 1.03 s
Wall time: 1.02 s
3 Numpy ndarray
2행 3열의 랜덤난수 생성 (randn : 표준정규분포)
= np.random.randn(2,3)
data data
array([[-0.2047, 0.4789, -0.5194],
[-0.5557, 1.9658, 1.3934]])
*10 data
array([[-2.0471, 4.7894, -5.1944],
[-5.5573, 19.6578, 13.9341]])
+ data data
array([[-0.4094, 0.9579, -1.0389],
[-1.1115, 3.9316, 2.7868]])
data.shape
(2, 3)
data.dtype
dtype('float64')
4 Creating ndarrays
list배열을 Numpy배열로 변환
= [6, 7.5, 8, 0, 1]
data1 = np.array(data1)
arr1 arr1
array([6. , 7.5, 8. , 0. , 1. ])
= [[1,2,3,4], [5,6,7,8]]
data2 = np.array(data2)
arr2 arr2
array([[1, 2, 3, 4],
[5, 6, 7, 8]])
차원 수
arr1.ndim, arr2.ndim
(1, 2)
arr2.shape
(2, 4)
arr1.dtype, arr2.dtype
(dtype('float64'), dtype('int32'))
10)
np.zeros(
array([0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
3,6)) np.zeros((
array([[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 0.]])
2,3,2)) np.empty((
array([[[1.1239e-311, 3.1620e-322],
[0.0000e+000, 0.0000e+000],
[1.7801e-306, 2.8808e+180]],
[[2.6303e-052, 6.5288e-038],
[1.5330e-075, 4.2843e-037],
[2.9306e-057, 2.6797e-032]]])
15) np.arange(
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
5 Data Types for ndarrays
데이터 타입 지정
= np.array([1,2,3], dtype=np.float64)
arr1 = np.array([1,2,3], dtype=np.int32)
arr2 arr1.dtype, arr2.dtype
(dtype('float64'), dtype('int32'))
= np.array([1,2,3,4,5])
arr arr.dtype
dtype('int32')
astype : 타입 변경 함수
= arr.astype(np.float64)
float_arr float_arr.dtype
dtype('float64')
= np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr arr
array([ 3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr.astype(np.int32)
array([ 3, -1, -2, 0, 12, 10])
바이트(b) 문자열
= np.array(['1.25', '-9.6', '42'], dtype=np.string_)
numeric_strings numeric_strings
array([b'1.25', b'-9.6', b'42'], dtype='|S4')
float) numeric_strings.astype(
array([ 1.25, -9.6 , 42. ])
= np.arange(10)
int_array = np.array([.22, .270, .357, .380, .44, .50], dtype=np.float64)
calibers int_array.astype(calibers.dtype)
array([0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])
u4 : 부호없는 4바이트 정수 데이터타입
= np.empty(8, dtype='u4')
empty_unit32 empty_unit32
array([ 0, 1075314688, 0, 1075707904, 0,
1075838976, 0, 1072693248], dtype=uint32)
6 Arithmetic with Numpy Arrays
= np.array([[1., 2., 3.], [4., 5., 6.]])
arr arr
array([[1., 2., 3.],
[4., 5., 6.]])
*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.3333],
[0.25 , 0.2 , 0.1667]])
**0.5 arr
array([[1. , 1.4142, 1.7321],
[2. , 2.2361, 2.4495]])
= np.array([[0., 4., 1.], [7., 2., 12.]])
arr2 arr2
array([[ 0., 4., 1.],
[ 7., 2., 12.]])
> arr arr2
array([[False, True, False],
[ True, False, True]])
7 Basic Indexing & Slicing
= np.arange(10)
arr arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
5] arr[
5
5:8] arr[
array([5, 6, 7])
5:8] = 12
arr[ arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
= arr[5:8]
arr_slice arr_slice
array([12, 12, 12])
1] = 12345
arr_slice[ arr_slice
array([ 12, 12345, 12])
기존 numpy배열 (arr)에도 반영
arr
array([ 0, 1, 2, 3, 4, 12, 12345, 12, 8,
9])
[:] = 전체 슬라이스 (배열의 모든 요소)
= 64
arr_slice[:] arr_slice
array([64, 64, 64])
arr
array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
= np.array([[1,2,3], [4,5,6], [7,8,9]])
arr2d arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
2] arr2d[
array([7, 8, 9])
0][2] arr2d[
3
0,2] arr2d[
3
= np.array([[[1,2,3], [4,5,6]], [[7,8,9], [10,11,12]]])
arr3d arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
0] arr3d[
array([[1, 2, 3],
[4, 5, 6]])
copy 사용시 기존 배열에 영향 X
= arr3d[0].copy()
old_values old_values
array([[1, 2, 3],
[4, 5, 6]])
0] = 42
arr3d[ arr3d
array([[[42, 42, 42],
[42, 42, 42]],
[[ 7, 8, 9],
[10, 11, 12]]])
0] = old_values
arr3d[ arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
1,0] arr3d[
array([7, 8, 9])
= arr3d[1]
x x
array([[ 7, 8, 9],
[10, 11, 12]])
0] x[
array([7, 8, 9])
7.1 Quiz 1
arr3d를 이용하여 array([[ 8, 10, 12], [14, 16, 18]]) 만들기
arr3d
array([[[ 1, 2, 3],
[ 4, 5, 6]],
[[ 7, 8, 9],
[10, 11, 12]]])
0] + arr3d[1] arr3d[
array([[ 8, 10, 12],
[14, 16, 18]])
axis : 축 지정
sum(axis=0) arr3d.
array([[ 8, 10, 12],
[14, 16, 18]])
7.2 Quiz 2
1차원으로 변경하시오
sum(axis=0).reshape(-1) arr3d.
array([ 8, 10, 12, 14, 16, 18])
7.3 Quiz 3
shape(2,2)인 [1,2,4,5]를 추출해보시오
0,:2,:2] arr3d[
array([[1, 2],
[4, 5]])
0,:,:2] arr3d[
array([[1, 2],
[4, 5]])
7.4 Quiz 4
[[0,7], [10,15]] 에서 [10, 22]를 출력하시오
= np.array([[0,7], [10,15]])
arr4 arr4
array([[ 0, 7],
[10, 15]])
sum(axis=0) arr4.
array([10, 22])
7.5 Indexing with Slices
arr
array([ 0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
1:6] arr[
array([ 1, 2, 3, 4, 64])
arr2d
array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
2] arr2d[:
array([[1, 2, 3],
[4, 5, 6]])
2, 1:] arr2d[:
array([[2, 3],
[5, 6]])
1, :2] arr2d[
array([4, 5])
2,2] arr2d[:
array([3, 6])
1] arr2d[:, :
array([[1],
[4],
[7]])
2, 1:] = 0
arr2d[: arr2d
array([[1, 0, 0],
[4, 0, 0],
[7, 8, 9]])
7.6 Boolean Indexing
= np.array(['Bob','Joe','Will', 'Bob', 'Will','Joe','Joe'])
names = np.random.randn(7,4)
data names, data
(array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4'),
array([[ 0.0929, 0.2817, 0.769 , 1.2464],
[ 1.0072, -1.2962, 0.275 , 0.2289],
[ 1.3529, 0.8864, -2.0016, -0.3718],
[ 1.669 , -0.4386, -0.5397, 0.477 ],
[ 3.2489, -1.0212, -0.5771, 0.1241],
[ 0.3026, 0.5238, 0.0009, 1.3438],
[-0.7135, -0.8312, -2.3702, -1.8608]]))
== 'Bob' names
array([ True, False, False, True, False, False, False])
== 'Bob'] data[names
array([[ 0.0929, 0.2817, 0.769 , 1.2464],
[ 1.669 , -0.4386, -0.5397, 0.477 ]])
== 'Bob', 2:] data[names
array([[ 0.769 , 1.2464],
[-0.5397, 0.477 ]])
== 'Bob', 3] data[names
array([1.2464, 0.477 ])
!= 'Bob' names
array([False, True, True, False, True, True, True])
~ : 불리언 배열의 각 요소를 논리적으로 반전 (T→F, T→F)
~(names == 'Bob')] data[
array([[ 1.0072, -1.2962, 0.275 , 0.2289],
[ 1.3529, 0.8864, -2.0016, -0.3718],
[ 3.2489, -1.0212, -0.5771, 0.1241],
[ 0.3026, 0.5238, 0.0009, 1.3438],
[-0.7135, -0.8312, -2.3702, -1.8608]])
= names == 'Bob'
cond ~cond] data[
array([[ 1.0072, -1.2962, 0.275 , 0.2289],
[ 1.3529, 0.8864, -2.0016, -0.3718],
[ 3.2489, -1.0212, -0.5771, 0.1241],
[ 0.3026, 0.5238, 0.0009, 1.3438],
[-0.7135, -0.8312, -2.3702, -1.8608]])
= (names == 'Bob') | (names == 'Will')
mask mask
array([ True, False, True, True, True, False, False])
data[mask]
array([[ 0.0929, 0.2817, 0.769 , 1.2464],
[ 1.3529, 0.8864, -2.0016, -0.3718],
[ 1.669 , -0.4386, -0.5397, 0.477 ],
[ 3.2489, -1.0212, -0.5771, 0.1241]])
< 0] = 0
data[data data
array([[0.0929, 0.2817, 0.769 , 1.2464],
[1.0072, 0. , 0.275 , 0.2289],
[1.3529, 0.8864, 0. , 0. ],
[1.669 , 0. , 0. , 0.477 ],
[3.2489, 0. , 0. , 0.1241],
[0.3026, 0.5238, 0.0009, 1.3438],
[0. , 0. , 0. , 0. ]])
!= 'Joe'] = 7
data[names data
array([[7. , 7. , 7. , 7. ],
[1.0072, 0. , 0.275 , 0.2289],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[7. , 7. , 7. , 7. ],
[0.3026, 0.5238, 0.0009, 1.3438],
[0. , 0. , 0. , 0. ]])
7.7 Fancy Indexing
= np.empty((8,4))
arr for i in range(8):
= i
arr[i]
arr
array([[0., 0., 0., 0.],
[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.],
[4., 4., 4., 4.],
[5., 5., 5., 5.],
[6., 6., 6., 6.],
[7., 7., 7., 7.]])
4,3,0,6]] arr[[
array([[4., 4., 4., 4.],
[3., 3., 3., 3.],
[0., 0., 0., 0.],
[6., 6., 6., 6.]])
뒤에서 부터 인덱싱
-3,-5,-7]] arr[[
array([[5., 5., 5., 5.],
[3., 3., 3., 3.],
[1., 1., 1., 1.]])
= np.arange(32).reshape((8,4))
arr arr
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, 30, 31]])
1,5,7,2], [0,3,1,2]] arr[[
array([ 4, 23, 29, 10])
행의 모든 값에 대해 열 선택
1,5,7,2]][:, [0,3,1,2]] arr[[
array([[ 4, 7, 5, 6],
[20, 23, 21, 22],
[28, 31, 29, 30],
[ 8, 11, 9, 10]])
7.8 Quiz 1
- arr에서 [12,17,31,26] 뽑기
arr
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, 30, 31]])
3,4,7,6],[0,1,3,2]] arr[[
array([12, 17, 31, 26])
7.9 Quiz 2
- shape(2,4)인 [16,17,19,18,12,13,15,14]뽑기
4,4,4,4],[3,3,3,3]],[[0,1,3,2],[0,1,3,2]]] arr[[[
array([[16, 17, 19, 18],
[12, 13, 15, 14]])
7.10 Transposing Arrays & Swapping Axes
= np.arange(15).reshape((3,5))
arr arr
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
T : 배열의 전치
arr.T
array([[ 0, 5, 10],
[ 1, 6, 11],
[ 2, 7, 12],
[ 3, 8, 13],
[ 4, 9, 14]])
= np.random.randn(6,3)
arr arr
array([[-0.8608, 0.5601, -1.2659],
[ 0.1198, -1.0635, 0.3329],
[-2.3594, -0.1995, -1.542 ],
[-0.9707, -1.307 , 0.2863],
[ 0.378 , -0.7539, 0.3313],
[ 1.3497, 0.0699, 0.2467]])
dot : 행렬곱
np.dot(arr.T, arr)
array([[ 9.2291, 0.9394, 4.948 ],
[ 0.9394, 3.7662, -1.3622],
[ 4.948 , -1.3622, 4.3437]])
= np.arange(16).reshape((2,2,4))
arr arr
array([[[ 0, 1, 2, 3],
[ 4, 5, 6, 7]],
[[ 8, 9, 10, 11],
[12, 13, 14, 15]]])
transpose : 축 변경
# 첫 번째, 두 번째 축 변경
1,0,2)) arr.transpose((
array([[[ 0, 1, 2, 3],
[ 8, 9, 10, 11]],
[[ 4, 5, 6, 7],
[12, 13, 14, 15]]])
swapaxes : 배열의 축 변경
# 첫 번째, 두 번째 축 변경
1,2) arr.swapaxes(
array([[[ 0, 4],
[ 1, 5],
[ 2, 6],
[ 3, 7]],
[[ 8, 12],
[ 9, 13],
[10, 14],
[11, 15]]])
8 Universal Functions
- Fast Element-Wise Array Functions
= np.arange(10)
arr arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
np.sqrt(arr)
array([0. , 1. , 1.4142, 1.7321, 2. , 2.2361, 2.4495, 2.6458,
2.8284, 3. ])
exp : 지수함수
np.exp(arr)
array([ 1. , 2.7183, 7.3891, 20.0855, 54.5982, 148.4132,
403.4288, 1096.6332, 2980.958 , 8103.0839])
= np.random.randn(8)
x x
array([-0.0119, 1.0048, 1.3272, -0.9193, -1.5491, 0.0222, 0.7584,
-0.6605])
= np.random.randn(8)
y y
array([ 0.8626, -0.01 , 0.05 , 0.6702, 0.853 , -0.9559, -0.0235,
-2.3042])
np.maximum(x,y)
array([ 0.8626, 1.0048, 1.3272, 0.6702, 0.853 , 0.0222, 0.7584,
-0.6605])
= np.random.randn(7) *5
arr arr
array([-3.2623, -6.0915, -6.663 , 5.3731, 3.6182, 3.45 , 5.0077])
modf : 정수부분과 소수부분 분리
= np.modf(arr)
remainder, whole_part remainder
array([-0.2623, -0.0915, -0.663 , 0.3731, 0.6182, 0.45 , 0.0077])
whole_part
array([-3., -6., -6., 5., 3., 3., 5.])
np.sqrt(arr)
C:\Users\seong taek\AppData\Local\Temp\ipykernel_13704\2296558006.py:1: RuntimeWarning: invalid value encountered in sqrt
np.sqrt(arr)
array([ nan, nan, nan, 2.318 , 1.9022, 1.8574, 2.2378])
np.sqrt(arr, arr)
C:\Users\seong taek\AppData\Local\Temp\ipykernel_13704\269955669.py:1: RuntimeWarning: invalid value encountered in sqrt
np.sqrt(arr, arr)
array([ nan, nan, nan, 2.318 , 1.9022, 1.8574, 2.2378])
arr
array([ nan, nan, nan, 2.318 , 1.9022, 1.8574, 2.2378])
9 Array
- Oriented Programming with Arrays
= np.arange(-5,5,0.01)
points points
array([-5. , -4.99, -4.98, -4.97, -4.96, -4.95, -4.94, -4.93, -4.92,
-4.91, -4.9 , -4.89, -4.88, -4.87, -4.86, -4.85, -4.84, -4.83,
-4.82, -4.81, -4.8 , -4.79, -4.78, -4.77, -4.76, -4.75, -4.74,
-4.73, -4.72, -4.71, -4.7 , -4.69, -4.68, -4.67, -4.66, -4.65,
-4.64, -4.63, -4.62, -4.61, -4.6 , -4.59, -4.58, -4.57, -4.56,
-4.55, -4.54, -4.53, -4.52, -4.51, -4.5 , -4.49, -4.48, -4.47,
-4.46, -4.45, -4.44, -4.43, -4.42, -4.41, -4.4 , -4.39, -4.38,
-4.37, -4.36, -4.35, -4.34, -4.33, -4.32, -4.31, -4.3 , -4.29,
-4.28, -4.27, -4.26, -4.25, -4.24, -4.23, -4.22, -4.21, -4.2 ,
-4.19, -4.18, -4.17, -4.16, -4.15, -4.14, -4.13, -4.12, -4.11,
-4.1 , -4.09, -4.08, -4.07, -4.06, -4.05, -4.04, -4.03, -4.02,
-4.01, -4. , -3.99, -3.98, -3.97, -3.96, -3.95, -3.94, -3.93,
-3.92, -3.91, -3.9 , -3.89, -3.88, -3.87, -3.86, -3.85, -3.84,
-3.83, -3.82, -3.81, -3.8 , -3.79, -3.78, -3.77, -3.76, -3.75,
-3.74, -3.73, -3.72, -3.71, -3.7 , -3.69, -3.68, -3.67, -3.66,
-3.65, -3.64, -3.63, -3.62, -3.61, -3.6 , -3.59, -3.58, -3.57,
-3.56, -3.55, -3.54, -3.53, -3.52, -3.51, -3.5 , -3.49, -3.48,
-3.47, -3.46, -3.45, -3.44, -3.43, -3.42, -3.41, -3.4 , -3.39,
-3.38, -3.37, -3.36, -3.35, -3.34, -3.33, -3.32, -3.31, -3.3 ,
-3.29, -3.28, -3.27, -3.26, -3.25, -3.24, -3.23, -3.22, -3.21,
-3.2 , -3.19, -3.18, -3.17, -3.16, -3.15, -3.14, -3.13, -3.12,
-3.11, -3.1 , -3.09, -3.08, -3.07, -3.06, -3.05, -3.04, -3.03,
-3.02, -3.01, -3. , -2.99, -2.98, -2.97, -2.96, -2.95, -2.94,
-2.93, -2.92, -2.91, -2.9 , -2.89, -2.88, -2.87, -2.86, -2.85,
-2.84, -2.83, -2.82, -2.81, -2.8 , -2.79, -2.78, -2.77, -2.76,
-2.75, -2.74, -2.73, -2.72, -2.71, -2.7 , -2.69, -2.68, -2.67,
-2.66, -2.65, -2.64, -2.63, -2.62, -2.61, -2.6 , -2.59, -2.58,
-2.57, -2.56, -2.55, -2.54, -2.53, -2.52, -2.51, -2.5 , -2.49,
-2.48, -2.47, -2.46, -2.45, -2.44, -2.43, -2.42, -2.41, -2.4 ,
-2.39, -2.38, -2.37, -2.36, -2.35, -2.34, -2.33, -2.32, -2.31,
-2.3 , -2.29, -2.28, -2.27, -2.26, -2.25, -2.24, -2.23, -2.22,
-2.21, -2.2 , -2.19, -2.18, -2.17, -2.16, -2.15, -2.14, -2.13,
-2.12, -2.11, -2.1 , -2.09, -2.08, -2.07, -2.06, -2.05, -2.04,
-2.03, -2.02, -2.01, -2. , -1.99, -1.98, -1.97, -1.96, -1.95,
-1.94, -1.93, -1.92, -1.91, -1.9 , -1.89, -1.88, -1.87, -1.86,
-1.85, -1.84, -1.83, -1.82, -1.81, -1.8 , -1.79, -1.78, -1.77,
-1.76, -1.75, -1.74, -1.73, -1.72, -1.71, -1.7 , -1.69, -1.68,
-1.67, -1.66, -1.65, -1.64, -1.63, -1.62, -1.61, -1.6 , -1.59,
-1.58, -1.57, -1.56, -1.55, -1.54, -1.53, -1.52, -1.51, -1.5 ,
-1.49, -1.48, -1.47, -1.46, -1.45, -1.44, -1.43, -1.42, -1.41,
-1.4 , -1.39, -1.38, -1.37, -1.36, -1.35, -1.34, -1.33, -1.32,
-1.31, -1.3 , -1.29, -1.28, -1.27, -1.26, -1.25, -1.24, -1.23,
-1.22, -1.21, -1.2 , -1.19, -1.18, -1.17, -1.16, -1.15, -1.14,
-1.13, -1.12, -1.11, -1.1 , -1.09, -1.08, -1.07, -1.06, -1.05,
-1.04, -1.03, -1.02, -1.01, -1. , -0.99, -0.98, -0.97, -0.96,
-0.95, -0.94, -0.93, -0.92, -0.91, -0.9 , -0.89, -0.88, -0.87,
-0.86, -0.85, -0.84, -0.83, -0.82, -0.81, -0.8 , -0.79, -0.78,
-0.77, -0.76, -0.75, -0.74, -0.73, -0.72, -0.71, -0.7 , -0.69,
-0.68, -0.67, -0.66, -0.65, -0.64, -0.63, -0.62, -0.61, -0.6 ,
-0.59, -0.58, -0.57, -0.56, -0.55, -0.54, -0.53, -0.52, -0.51,
-0.5 , -0.49, -0.48, -0.47, -0.46, -0.45, -0.44, -0.43, -0.42,
-0.41, -0.4 , -0.39, -0.38, -0.37, -0.36, -0.35, -0.34, -0.33,
-0.32, -0.31, -0.3 , -0.29, -0.28, -0.27, -0.26, -0.25, -0.24,
-0.23, -0.22, -0.21, -0.2 , -0.19, -0.18, -0.17, -0.16, -0.15,
-0.14, -0.13, -0.12, -0.11, -0.1 , -0.09, -0.08, -0.07, -0.06,
-0.05, -0.04, -0.03, -0.02, -0.01, -0. , 0.01, 0.02, 0.03,
0.04, 0.05, 0.06, 0.07, 0.08, 0.09, 0.1 , 0.11, 0.12,
0.13, 0.14, 0.15, 0.16, 0.17, 0.18, 0.19, 0.2 , 0.21,
0.22, 0.23, 0.24, 0.25, 0.26, 0.27, 0.28, 0.29, 0.3 ,
0.31, 0.32, 0.33, 0.34, 0.35, 0.36, 0.37, 0.38, 0.39,
0.4 , 0.41, 0.42, 0.43, 0.44, 0.45, 0.46, 0.47, 0.48,
0.49, 0.5 , 0.51, 0.52, 0.53, 0.54, 0.55, 0.56, 0.57,
0.58, 0.59, 0.6 , 0.61, 0.62, 0.63, 0.64, 0.65, 0.66,
0.67, 0.68, 0.69, 0.7 , 0.71, 0.72, 0.73, 0.74, 0.75,
0.76, 0.77, 0.78, 0.79, 0.8 , 0.81, 0.82, 0.83, 0.84,
0.85, 0.86, 0.87, 0.88, 0.89, 0.9 , 0.91, 0.92, 0.93,
0.94, 0.95, 0.96, 0.97, 0.98, 0.99, 1. , 1.01, 1.02,
1.03, 1.04, 1.05, 1.06, 1.07, 1.08, 1.09, 1.1 , 1.11,
1.12, 1.13, 1.14, 1.15, 1.16, 1.17, 1.18, 1.19, 1.2 ,
1.21, 1.22, 1.23, 1.24, 1.25, 1.26, 1.27, 1.28, 1.29,
1.3 , 1.31, 1.32, 1.33, 1.34, 1.35, 1.36, 1.37, 1.38,
1.39, 1.4 , 1.41, 1.42, 1.43, 1.44, 1.45, 1.46, 1.47,
1.48, 1.49, 1.5 , 1.51, 1.52, 1.53, 1.54, 1.55, 1.56,
1.57, 1.58, 1.59, 1.6 , 1.61, 1.62, 1.63, 1.64, 1.65,
1.66, 1.67, 1.68, 1.69, 1.7 , 1.71, 1.72, 1.73, 1.74,
1.75, 1.76, 1.77, 1.78, 1.79, 1.8 , 1.81, 1.82, 1.83,
1.84, 1.85, 1.86, 1.87, 1.88, 1.89, 1.9 , 1.91, 1.92,
1.93, 1.94, 1.95, 1.96, 1.97, 1.98, 1.99, 2. , 2.01,
2.02, 2.03, 2.04, 2.05, 2.06, 2.07, 2.08, 2.09, 2.1 ,
2.11, 2.12, 2.13, 2.14, 2.15, 2.16, 2.17, 2.18, 2.19,
2.2 , 2.21, 2.22, 2.23, 2.24, 2.25, 2.26, 2.27, 2.28,
2.29, 2.3 , 2.31, 2.32, 2.33, 2.34, 2.35, 2.36, 2.37,
2.38, 2.39, 2.4 , 2.41, 2.42, 2.43, 2.44, 2.45, 2.46,
2.47, 2.48, 2.49, 2.5 , 2.51, 2.52, 2.53, 2.54, 2.55,
2.56, 2.57, 2.58, 2.59, 2.6 , 2.61, 2.62, 2.63, 2.64,
2.65, 2.66, 2.67, 2.68, 2.69, 2.7 , 2.71, 2.72, 2.73,
2.74, 2.75, 2.76, 2.77, 2.78, 2.79, 2.8 , 2.81, 2.82,
2.83, 2.84, 2.85, 2.86, 2.87, 2.88, 2.89, 2.9 , 2.91,
2.92, 2.93, 2.94, 2.95, 2.96, 2.97, 2.98, 2.99, 3. ,
3.01, 3.02, 3.03, 3.04, 3.05, 3.06, 3.07, 3.08, 3.09,
3.1 , 3.11, 3.12, 3.13, 3.14, 3.15, 3.16, 3.17, 3.18,
3.19, 3.2 , 3.21, 3.22, 3.23, 3.24, 3.25, 3.26, 3.27,
3.28, 3.29, 3.3 , 3.31, 3.32, 3.33, 3.34, 3.35, 3.36,
3.37, 3.38, 3.39, 3.4 , 3.41, 3.42, 3.43, 3.44, 3.45,
3.46, 3.47, 3.48, 3.49, 3.5 , 3.51, 3.52, 3.53, 3.54,
3.55, 3.56, 3.57, 3.58, 3.59, 3.6 , 3.61, 3.62, 3.63,
3.64, 3.65, 3.66, 3.67, 3.68, 3.69, 3.7 , 3.71, 3.72,
3.73, 3.74, 3.75, 3.76, 3.77, 3.78, 3.79, 3.8 , 3.81,
3.82, 3.83, 3.84, 3.85, 3.86, 3.87, 3.88, 3.89, 3.9 ,
3.91, 3.92, 3.93, 3.94, 3.95, 3.96, 3.97, 3.98, 3.99,
4. , 4.01, 4.02, 4.03, 4.04, 4.05, 4.06, 4.07, 4.08,
4.09, 4.1 , 4.11, 4.12, 4.13, 4.14, 4.15, 4.16, 4.17,
4.18, 4.19, 4.2 , 4.21, 4.22, 4.23, 4.24, 4.25, 4.26,
4.27, 4.28, 4.29, 4.3 , 4.31, 4.32, 4.33, 4.34, 4.35,
4.36, 4.37, 4.38, 4.39, 4.4 , 4.41, 4.42, 4.43, 4.44,
4.45, 4.46, 4.47, 4.48, 4.49, 4.5 , 4.51, 4.52, 4.53,
4.54, 4.55, 4.56, 4.57, 4.58, 4.59, 4.6 , 4.61, 4.62,
4.63, 4.64, 4.65, 4.66, 4.67, 4.68, 4.69, 4.7 , 4.71,
4.72, 4.73, 4.74, 4.75, 4.76, 4.77, 4.78, 4.79, 4.8 ,
4.81, 4.82, 4.83, 4.84, 4.85, 4.86, 4.87, 4.88, 4.89,
4.9 , 4.91, 4.92, 4.93, 4.94, 4.95, 4.96, 4.97, 4.98,
4.99])
meshgrid : 행, 열 기준으로 각각 배열
= np.meshgrid(points, points)
xs, ys ys
array([[-5. , -5. , -5. , ..., -5. , -5. , -5. ],
[-4.99, -4.99, -4.99, ..., -4.99, -4.99, -4.99],
[-4.98, -4.98, -4.98, ..., -4.98, -4.98, -4.98],
...,
[ 4.97, 4.97, 4.97, ..., 4.97, 4.97, 4.97],
[ 4.98, 4.98, 4.98, ..., 4.98, 4.98, 4.98],
[ 4.99, 4.99, 4.99, ..., 4.99, 4.99, 4.99]])
xs
array([[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
...,
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99],
[-5. , -4.99, -4.98, ..., 4.97, 4.98, 4.99]])
= np.sqrt(xs **2 +ys**2)
z z
array([[7.0711, 7.064 , 7.0569, ..., 7.0499, 7.0569, 7.064 ],
[7.064 , 7.0569, 7.0499, ..., 7.0428, 7.0499, 7.0569],
[7.0569, 7.0499, 7.0428, ..., 7.0357, 7.0428, 7.0499],
...,
[7.0499, 7.0428, 7.0357, ..., 7.0286, 7.0357, 7.0428],
[7.0569, 7.0499, 7.0428, ..., 7.0357, 7.0428, 7.0499],
[7.064 , 7.0569, 7.0499, ..., 7.0428, 7.0499, 7.0569]])
import matplotlib.pyplot as plt
=plt.cm.gray); plt.colorbar()
plt.imshow(z, cmap"Image plot of $\sqrt{x^2 +y^2}$ for a grid of values") plt.title(
Text(0.5, 1.0, 'Image plot of $\\sqrt{x^2 +y^2}$ for a grid of values')
plt.draw()
<Figure size 1000x600 with 0 Axes>
'all') plt.close(
10 Expressing Conditional Logic as Array Operations
= np.array([1.1, 1.2, 1.3, 1.4, 1.5])
xarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
yarr = np.array([True, False, True, True, False]) cond
= [(x if c else y)
result for x,y,c in zip(xarr, yarr, cond)]
result
[1.1, 2.2, 1.3, 1.4, 2.5]
where : 조건에 따라 두개의 배열 중에서 값 선택
= np.where(cond, xarr, yarr)
result result
array([1.1, 2.2, 1.3, 1.4, 2.5])
조건 : arr>0
= np.random.randn(4,4)
arr
arr>0
arr> 0,2,-2) np.where(arr
array([[-2, -2, -2, -2],
[ 2, 2, -2, 2],
[ 2, 2, 2, -2],
[ 2, -2, 2, 2]])
> 0,2,arr) np.where(arr
array([[-0.5031, -0.6223, -0.9212, -0.7262],
[ 2. , 2. , -1.1577, 2. ],
[ 2. , 2. , 2. , -0.9975],
[ 2. , -0.1316, 2. , 2. ]])
11 Mathematical and Statistical Methods
= np.random.randn(5,4)
arr arr
array([[ 2.1695, -0.1149, 2.0037, 0.0296],
[ 0.7953, 0.1181, -0.7485, 0.585 ],
[ 0.1527, -1.5657, -0.5625, -0.0327],
[-0.929 , -0.4826, -0.0363, 1.0954],
[ 0.9809, -0.5895, 1.5817, -0.5287]])
arr.mean()
0.19607051119998253
np.mean(arr)
0.19607051119998253
sum() arr.
3.9214102239996507
sum(arr) np.
3.9214102239996507
=1) arr.mean(axis
array([ 1.022 , 0.1875, -0.502 , -0.0881, 0.3611])
sum(axis=0) arr.
array([ 3.1693, -2.6345, 2.2381, 1.1486])
cumsum : 배열의 누적합 계산
= np.array([0,1,2,3,4,5,6,7])
arr arr.cumsum()
array([ 0, 1, 3, 6, 10, 15, 21, 28])
= np.array([[0,1,2], [3,4,5], [6,7,8]])
arr arr
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
=0) arr.cumsum(axis
array([[ 0, 1, 2],
[ 3, 5, 7],
[ 9, 12, 15]])
cumprod : 누적곱 계산
=1) arr.cumprod(axis
array([[ 0, 0, 0],
[ 3, 12, 60],
[ 6, 42, 336]])
12 Methoods for Boolean Arrays
= np.random.randn(100)
arr > 0).sum() (arr
42
any :True가 하나 이상이면 True
= np.array([False,False,True,True])
bools any() bools.
True
all : 모두 True이면 True
all() bools.
False
13 Sorting
= np.random.randn(6)
arr arr
array([ 0.6095, -0.4938, 1.24 , -0.1357, 1.43 , -0.8469])
arr.sort() arr
array([-0.8469, -0.4938, -0.1357, 0.6095, 1.24 , 1.43 ])
= np.random.randn(5,3)
arr arr
array([[ 0.6033, 1.2636, -0.2555],
[-0.4457, 0.4684, -0.9616],
[-1.8245, 0.6254, 1.0229],
[ 1.1074, 0.0909, -0.3501],
[ 0.218 , -0.8948, -1.7415]])
sort(1) :행기준 정렬
1)
arr.sort( arr
array([[-0.2555, 0.6033, 1.2636],
[-0.9616, -0.4457, 0.4684],
[-1.8245, 0.6254, 1.0229],
[-0.3501, 0.0909, 1.1074],
[-1.7415, -0.8948, 0.218 ]])
5% 분위수에 해당하는 값 출력
= np.random.randn(1000)
large_arr
large_arr.sort()int(0.05 * len(large_arr))] large_arr[
-1.5311513550102103
14 Unique & Other Set Logic
= np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
names names
array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'], dtype='<U4')
np.unique(names)
array(['Bob', 'Joe', 'Will'], dtype='<U4')
= np.array([3,3,3,2,2,1,1,4,4])
ints np.unique(ints)
array([1, 2, 3, 4])
set : unique 기능
sorted(set(names))
['Bob', 'Joe', 'Will']
in1d : 첫 번째 배열에 대해 각 요소가 두 번째 배열에 포함되는지를 검사하고, 결과를 boolean 배열로 반환
= np.array([6,0,0,3,2,5,6])
values 2,3,6]) np.in1d(values, [
array([ True, False, False, True, True, False, True])
15 File Input & Output with Arrays
= np.arange(10)
arr 'some_array', arr) np.save(
'some_array.npy') np.load(
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
'array_archive.npz', a=arr, b=arr) np.savez(
= np.load('array_archive.npz')
arch 'b'] arch[
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
'arrays_compressed.npz', a=arr, b=arr) np.savez_compressed(
!rm some_array.npy
!rm array_archive.npz
!rm arrays_compressed.npz
'rm'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
'rm'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
'rm'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는
배치 파일이 아닙니다.
16 Linear Algebra
= np.array([[1.,2.,3.], [4., 5., 6.]])
x = np.array([[6., 23.], [-1, 7],[8,9]])
y x
array([[1., 2., 3.],
[4., 5., 6.]])
y
array([[ 6., 23.],
[-1., 7.],
[ 8., 9.]])
x.dot(y)
array([[ 28., 64.],
[ 67., 181.]])
3)) np.dot(x, np.ones(
array([ 6., 15.])
@ : 행렬곱셈
@ np.ones(3) x
array([ 6., 15.])
inv : 역행렬
from numpy.linalg import inv, qr
= np.random.randn(5,5)
X = X.T.dot(X)
mat inv(mat)
array([[ 933.1189, 871.8258, -1417.6902, -1460.4005, 1782.1391],
[ 871.8258, 815.3929, -1325.9965, -1365.9242, 1666.9347],
[-1417.6902, -1325.9965, 2158.4424, 2222.0191, -2711.6822],
[-1460.4005, -1365.9242, 2222.0191, 2289.0575, -2793.422 ],
[ 1782.1391, 1666.9347, -2711.6822, -2793.422 , 3409.5128]])
mat.dot(inv(mat))
array([[ 1., -0., 0., 0., -0.],
[ 0., 1., 0., -0., -0.],
[ 0., 0., 1., -0., 0.],
[ 0., -0., -0., 1., 0.],
[ 0., 0., -0., -0., 1.]])
qr : QR분해 - q(직교행렬), r(상삼각행렬)
= qr(mat) q, r
q
array([[-0.6328, -0.5603, -0.2526, 0.3533, 0.3115],
[ 0.7629, -0.5331, -0.1675, 0.1443, 0.2913],
[ 0.0084, -0.0493, -0.8433, -0.2484, -0.4739],
[-0.0826, -0.632 , 0.4316, -0.4112, -0.4882],
[-0.1033, -0.0035, -0.1032, -0.7897, 0.5959]])
r
array([[-1.6914, 4.38 , 0.1757, 0.4075, -0.7838],
[ 0. , -2.6436, 0.1939, -3.072 , -1.0702],
[ 0. , 0. , -0.8138, 1.5414, 0.6155],
[ 0. , 0. , 0. , -2.6445, -2.1669],
[ 0. , 0. , 0. , 0. , 0.0002]])
17 Pseudorandom Number Generation
normal : 정규분포
= np.random.normal(size=(4,4))
samples samples
array([[ 0.5732, 0.1933, 0.4429, 1.2796],
[ 0.575 , 0.4339, -0.7658, -1.237 ],
[-0.5367, 1.8545, -0.92 , -0.1082],
[ 0.1525, 0.9435, -1.0953, -0.144 ]])
from random import normalvariate
= 1000000
N %timeit samples = [normalvariate(0,1) for _ in range(N)]
%timeit np.random.normal(size=N)
1.14 s ± 168 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
33.6 ms ± 3.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
1234) np.random.seed(
np.random.RandomState : 난수 생성기 객체 생성
= np.random.RandomState(1234)
rng 10) rng.randn(
array([ 0.4714, -1.191 , 1.4327, -0.3127, -0.7206, 0.8872, 0.8596,
-0.6365, 0.0157, -2.2427])
18 Example : Random Walks
import random
42)
random.seed(= 0 # 초기 위치
position = [position]
walk = 1000 # 전체 스텝 수
steps = np.empty(steps, dtype=int)
step_list for i in range(steps):
# 0또는1을 랜덤하게 선택하여 1이면 1을, 0이면 -1을 step 변수에 할당
# 스텝 마다 움직이는 방향 랜덤
= 1 if random.randint(0,1) else -1
step += step # 현재위치에 step 값을 더하여 다음 위치를 계산
position
walk.append(position)= i step_list[i]
plt.figure()
<Figure size 1000x600 with 0 Axes>
<Figure size 1000x600 with 0 Axes>
1000]) plt.plot(walk[:
[<matplotlib.lines.Line2D at 0x211ae859310>]
가장 높은 포지션에 도달했을 때는 몇번째 step인가, 가장 높은 포지션
np.argmax : 배열에서 가장 큰 인덱스 위치
np.max : 배열에서 가장 큰 값
max(walk) np.argmax(walk), np.
(997, 29)
지금 이사람은 앞으로 몇번 전진했을까요?
# 전진만한 값의 총합
sum(np.array(walk)>0) np.
219
# 처음으로 원점으로부터 10만큼 떨어진 위치는 무엇?
abs(walk) >= 10).argmax() (np.
14
# 전진한 값의 총합
import random
42)
random.seed(= 0
position = [position]
walk = 1000
nsteps =[]
step_list for i in range(nsteps):
= 1 if random.randint(0,1) else -1
step += step
position
walk.append(position)
step_list.append(step)
sum(np.array(step_list)==1) np.
514
주사위 (1~6)의 눈금을 가지는 주사위를 던져서 5이상이면 앞으로 한칸, 그렇지 않으면 뒤로 한칸 가는 random walk 작성
cumsum은 array를 input으로 받아서 누적합을 계산해준다
= 1000
nsteps = np.random.randint(1,7,size = nsteps)
draws #draws[:100]
= np.where(draws >= 5,1,-1)
steps = steps.cumsum()
walk walk
array([ -1, 0, 1, 2, 1, 0, -1, -2, -3, -4, -3,
-2, -3, -4, -5, -6, -5, -4, -5, -6, -7, -8,
-9, -8, -7, -8, -9, -10, -11, -12, -13, -14, -15,
-16, -17, -18, -17, -18, -19, -20, -21, -22, -23, -24,
-23, -24, -25, -24, -25, -24, -23, -24, -23, -22, -21,
-22, -21, -22, -21, -22, -21, -20, -21, -22, -23, -24,
-23, -24, -23, -24, -25, -26, -27, -26, -27, -26, -25,
-24, -25, -24, -23, -24, -25, -24, -23, -24, -25, -26,
-27, -28, -27, -28, -29, -30, -31, -32, -33, -34, -35,
-36, -37, -36, -35, -36, -37, -36, -37, -36, -35, -36,
-37, -38, -39, -40, -39, -38, -39, -38, -39, -40, -41,
-40, -41, -40, -41, -42, -41, -42, -41, -42, -43, -44,
-45, -46, -47, -48, -49, -50, -51, -52, -53, -52, -53,
-54, -55, -56, -57, -56, -55, -56, -57, -56, -55, -54,
-55, -56, -57, -56, -57, -56, -57, -58, -57, -58, -59,
-60, -61, -62, -63, -64, -65, -66, -67, -66, -65, -64,
-63, -64, -65, -64, -65, -66, -67, -68, -69, -68, -67,
-68, -69, -70, -69, -68, -67, -68, -69, -68, -69, -70,
-71, -72, -71, -72, -73, -74, -75, -76, -77, -78, -77,
-78, -79, -78, -79, -80, -81, -82, -83, -84, -85, -86,
-85, -86, -85, -86, -87, -88, -87, -88, -87, -88, -89,
-90, -91, -92, -93, -92, -93, -94, -95, -94, -95, -94,
-95, -96, -97, -98, -99, -98, -99, -100, -99, -98, -97,
-98, -97, -98, -99, -100, -101, -102, -101, -102, -103, -104,
-103, -104, -103, -102, -103, -104, -105, -106, -107, -106, -105,
-104, -105, -104, -103, -102, -103, -104, -103, -104, -103, -104,
-105, -106, -107, -106, -105, -106, -107, -108, -107, -108, -109,
-110, -109, -110, -111, -112, -113, -114, -113, -114, -115, -116,
-117, -118, -119, -118, -119, -120, -119, -120, -119, -118, -119,
-120, -119, -120, -121, -122, -123, -124, -125, -126, -127, -128,
-127, -128, -129, -130, -129, -130, -131, -130, -131, -130, -129,
-130, -131, -132, -133, -132, -133, -134, -133, -134, -135, -134,
-133, -132, -133, -134, -133, -134, -133, -134, -135, -134, -133,
-134, -133, -132, -131, -130, -131, -132, -133, -134, -133, -132,
-133, -134, -135, -134, -135, -136, -137, -138, -139, -138, -139,
-140, -141, -140, -141, -142, -143, -144, -145, -146, -147, -146,
-145, -146, -145, -146, -147, -148, -147, -146, -147, -148, -149,
-150, -149, -150, -149, -150, -151, -150, -151, -152, -153, -154,
-155, -154, -155, -156, -155, -156, -157, -158, -157, -158, -159,
-158, -159, -160, -161, -162, -163, -162, -163, -162, -161, -160,
-161, -162, -161, -162, -163, -162, -163, -164, -163, -162, -163,
-162, -163, -164, -163, -164, -165, -166, -167, -168, -169, -170,
-171, -170, -171, -172, -173, -174, -175, -176, -175, -176, -177,
-176, -175, -176, -175, -176, -175, -176, -177, -176, -175, -176,
-175, -176, -177, -176, -175, -176, -177, -178, -179, -180, -181,
-180, -179, -178, -179, -178, -179, -180, -179, -178, -179, -180,
-181, -182, -181, -180, -181, -180, -181, -180, -181, -182, -183,
-184, -183, -184, -185, -186, -187, -188, -189, -190, -191, -192,
-193, -194, -195, -194, -195, -196, -195, -196, -197, -196, -197,
-196, -197, -198, -199, -200, -199, -200, -201, -200, -199, -200,
-201, -202, -203, -204, -205, -204, -203, -204, -205, -204, -205,
-204, -205, -204, -205, -206, -207, -208, -209, -210, -209, -208,
-207, -208, -207, -208, -209, -210, -211, -212, -213, -214, -213,
-214, -213, -212, -213, -212, -213, -212, -211, -212, -211, -212,
-213, -214, -215, -214, -215, -214, -215, -214, -215, -216, -217,
-216, -217, -216, -215, -214, -213, -212, -213, -214, -215, -216,
-217, -218, -219, -220, -219, -220, -221, -222, -223, -224, -225,
-224, -223, -224, -225, -226, -227, -228, -229, -230, -231, -230,
-231, -230, -231, -232, -233, -234, -235, -234, -233, -232, -231,
-232, -233, -234, -235, -234, -235, -234, -233, -234, -235, -234,
-235, -236, -237, -236, -237, -238, -237, -238, -239, -240, -239,
-240, -239, -240, -241, -242, -243, -244, -243, -244, -243, -242,
-243, -244, -245, -246, -245, -244, -243, -242, -243, -244, -243,
-244, -245, -246, -247, -248, -249, -250, -251, -252, -253, -254,
-253, -254, -253, -254, -255, -256, -255, -256, -257, -256, -257,
-258, -259, -260, -261, -262, -263, -262, -261, -262, -263, -264,
-265, -266, -267, -268, -269, -270, -269, -270, -269, -270, -269,
-270, -271, -270, -271, -272, -271, -272, -271, -272, -273, -272,
-273, -272, -271, -272, -271, -272, -273, -272, -273, -274, -275,
-274, -275, -274, -275, -276, -275, -276, -275, -274, -275, -274,
-275, -276, -277, -278, -279, -280, -281, -280, -281, -282, -283,
-284, -283, -284, -285, -286, -287, -288, -289, -290, -289, -290,
-291, -292, -291, -292, -291, -290, -291, -292, -291, -292, -293,
-292, -293, -292, -293, -294, -293, -292, -293, -294, -295, -294,
-295, -296, -297, -298, -299, -300, -301, -302, -303, -304, -305,
-304, -305, -306, -307, -308, -307, -308, -307, -306, -307, -308,
-307, -308, -309, -308, -307, -306, -305, -304, -305, -304, -305,
-304, -305, -306, -307, -306, -307, -308, -309, -310, -309, -310,
-311, -312, -313, -314, -313, -314, -313, -314, -313, -312, -311,
-310, -309, -310, -311, -312, -313, -314, -313, -314, -315, -316,
-317, -318, -319, -320, -321, -322, -323, -324, -325, -326, -327,
-328, -329, -330, -331, -332, -331, -332, -333, -332, -331, -332,
-333, -334, -335, -334, -333, -332, -333, -334, -335, -336, -335,
-334, -333, -334, -333, -332, -333, -334, -335, -334, -335, -336,
-337, -338, -337, -336, -337, -336, -335, -336, -335, -336, -335,
-334, -335, -336, -337, -338, -339, -340, -341, -340, -341, -340,
-341, -340, -341, -342, -343, -344, -343, -342, -341, -342, -343,
-344, -345, -344, -343, -344, -345, -344, -343, -344, -345, -346,
-345, -346, -345, -346, -347, -346, -347, -348, -349, -350, -351,
-352, -353, -352, -353, -352, -351, -352, -353, -354, -353, -354,
-355, -356, -355, -356, -357, -358, -359, -358, -359, -358])
min(), walk.max() walk.
(-359, 2)
abs(walk) >= 10).argmax() (np.
27
= 1000
nsteps = np.random.randint(0,2,size = nsteps)
draws = np.where(draws > 0,1,-1)
steps = steps.cumsum()
walk walk
array([-1, -2, -3, -4, -3, -4, -5, -4, -5, -4, -3, -2, -1, 0, 1, 2, 1,
0, -1, 0, 1, 0, -1, -2, -3, -2, -3, -2, -3, -2, -1, -2, -1, 0,
-1, 0, -1, 0, -1, 0, 1, 0, -1, -2, -3, -2, -1, -2, -1, 0, 1,
2, 1, 2, 3, 4, 5, 6, 5, 4, 3, 2, 3, 4, 3, 2, 3, 2,
3, 4, 3, 2, 3, 4, 5, 4, 5, 6, 5, 4, 5, 4, 5, 6, 7,
8, 7, 6, 7, 8, 7, 8, 9, 10, 11, 12, 13, 12, 11, 10, 11, 12,
13, 14, 15, 16, 15, 16, 15, 14, 15, 14, 15, 14, 15, 16, 15, 16, 17,
18, 19, 18, 19, 20, 19, 18, 19, 18, 17, 16, 17, 18, 17, 18, 19, 18,
19, 20, 21, 20, 21, 22, 23, 22, 23, 22, 23, 22, 23, 22, 21, 20, 19,
18, 19, 20, 19, 18, 19, 18, 17, 16, 17, 18, 17, 18, 19, 18, 17, 16,
17, 18, 17, 16, 17, 18, 17, 16, 17, 16, 17, 18, 17, 18, 17, 16, 17,
18, 17, 18, 19, 18, 19, 18, 19, 18, 19, 20, 19, 20, 19, 20, 19, 18,
17, 18, 19, 20, 19, 18, 17, 18, 17, 18, 19, 20, 19, 20, 21, 22, 21,
22, 21, 20, 19, 18, 19, 18, 19, 18, 19, 18, 17, 18, 17, 16, 17, 16,
17, 18, 19, 18, 19, 18, 19, 18, 17, 18, 17, 18, 19, 20, 19, 20, 19,
20, 19, 18, 19, 18, 17, 16, 17, 16, 15, 16, 15, 16, 17, 18, 19, 18,
19, 18, 19, 18, 19, 20, 21, 22, 21, 22, 21, 20, 19, 20, 19, 18, 17,
18, 19, 18, 17, 16, 15, 16, 15, 14, 13, 12, 13, 12, 13, 14, 13, 14,
15, 16, 17, 18, 19, 18, 17, 16, 17, 18, 19, 20, 19, 18, 17, 16, 17,
18, 17, 16, 17, 16, 17, 18, 17, 18, 17, 18, 19, 18, 17, 16, 15, 14,
15, 14, 13, 14, 15, 16, 15, 14, 13, 12, 13, 12, 13, 14, 13, 12, 13,
14, 13, 12, 13, 14, 15, 16, 17, 16, 15, 14, 15, 14, 15, 14, 13, 12,
11, 12, 13, 12, 11, 10, 11, 10, 9, 8, 9, 10, 11, 12, 11, 12, 11,
12, 11, 12, 11, 10, 9, 8, 9, 10, 11, 10, 11, 12, 13, 14, 13, 14,
15, 14, 15, 16, 17, 18, 19, 18, 17, 18, 19, 18, 17, 16, 17, 18, 19,
18, 17, 18, 17, 18, 19, 18, 17, 16, 17, 18, 17, 16, 15, 14, 15, 14,
15, 14, 13, 14, 15, 14, 13, 14, 13, 14, 15, 16, 15, 16, 17, 16, 15,
14, 13, 12, 13, 12, 11, 10, 9, 10, 9, 10, 9, 8, 7, 6, 5, 6,
5, 6, 7, 8, 7, 8, 9, 10, 11, 12, 13, 12, 11, 12, 11, 10, 9,
8, 7, 8, 7, 8, 7, 6, 7, 6, 7, 8, 7, 6, 5, 4, 5, 4,
5, 6, 7, 6, 7, 8, 9, 8, 9, 10, 9, 8, 7, 6, 7, 6, 7,
8, 9, 10, 11, 10, 9, 10, 9, 10, 9, 8, 7, 8, 7, 8, 7, 8,
9, 10, 11, 10, 11, 12, 13, 12, 13, 12, 11, 12, 13, 12, 13, 12, 11,
12, 13, 12, 13, 12, 11, 10, 9, 10, 9, 10, 9, 10, 9, 10, 11, 10,
11, 12, 13, 14, 15, 14, 13, 14, 15, 16, 15, 14, 15, 16, 15, 14, 13,
12, 13, 12, 13, 12, 11, 10, 9, 8, 7, 6, 7, 6, 7, 6, 7, 8,
9, 10, 9, 10, 9, 8, 9, 8, 7, 8, 9, 8, 7, 8, 9, 10, 11,
12, 11, 12, 13, 14, 13, 14, 13, 14, 15, 16, 17, 18, 17, 18, 17, 18,
19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 27, 26, 27, 28, 29, 30, 29,
28, 29, 28, 29, 30, 31, 32, 31, 32, 31, 32, 31, 30, 31, 32, 33, 34,
35, 34, 35, 36, 35, 36, 35, 36, 35, 36, 37, 38, 39, 40, 41, 42, 43,
44, 45, 46, 47, 46, 45, 44, 45, 44, 43, 42, 41, 42, 41, 40, 41, 42,
43, 42, 41, 42, 41, 40, 39, 38, 39, 40, 41, 42, 43, 42, 41, 40, 41,
40, 39, 40, 41, 40, 39, 40, 39, 40, 39, 40, 41, 40, 39, 40, 39, 40,
41, 42, 43, 42, 43, 44, 45, 44, 45, 44, 45, 46, 47, 48, 49, 50, 49,
50, 51, 52, 53, 54, 53, 54, 55, 56, 55, 54, 55, 54, 55, 56, 57, 58,
59, 58, 59, 60, 59, 58, 57, 58, 59, 58, 57, 58, 59, 58, 57, 58, 57,
56, 55, 56, 57, 58, 59, 58, 57, 56, 55, 54, 53, 54, 53, 52, 51, 50,
51, 52, 53, 54, 53, 52, 53, 54, 53, 52, 51, 52, 53, 54, 53, 54, 53,
52, 51, 52, 51, 52, 53, 52, 53, 52, 51, 52, 53, 54, 55, 56, 55, 54,
55, 54, 53, 52, 53, 54, 55, 56, 55, 56, 55, 54, 55, 54, 53, 54, 53,
52, 51, 50, 49, 48, 49, 48, 47, 46, 47, 48, 49, 50, 49, 48, 49, 50,
51, 52, 51, 50, 49, 48, 47, 48, 47, 48, 49, 48, 47, 48, 49, 50, 49,
50, 49, 50, 49, 50, 51, 52, 53, 52, 53, 54, 53, 52, 53, 52, 53, 52,
53, 52, 51, 50, 51, 50, 51, 52, 51, 50, 49, 50, 49, 50, 51, 50, 51,
52, 53, 52, 53, 54, 55, 54, 55, 54, 53, 52, 51, 50, 51, 50, 49, 50,
51, 50, 49, 50, 51, 50, 51, 50, 51, 52, 53, 52, 53, 52, 53, 52, 51,
50, 49, 48, 47, 46, 47, 48, 49, 48, 49, 48, 49, 48, 49, 48, 47, 46,
45, 44, 45, 46, 47, 46, 45, 44, 45, 46, 45, 44, 45, 46])
min(), walk.max() walk.
(-5, 60)
abs(walk) >= 10).argmax() (np.
93
19 Simulating Many Random Walks at Once
= 5000
nwalks = 1000
nsteps = np.random.randint(0,2, size = (nwalks, nsteps)) # 0 or 1
draws = np.where(draws >0, 1, -1)
steps = steps.cumsum(1)
walks walks
array([[ 1, 2, 3, ..., 8, 7, 6],
[ -1, 0, 1, ..., -34, -35, -36],
[ -1, -2, -1, ..., 66, 67, 66],
...,
[ -1, -2, -3, ..., -34, -35, -34],
[ 1, 2, 1, ..., 74, 75, 74],
[ -1, -2, -3, ..., -32, -31, -32]])
max() walks.
112
min() walks.
-111
= (np.abs(walks) >= 30).any(1)
hits30 sum() hits30.
3410
= (np.abs(walks[hits30]) >= 30).argmax(1)
crossing_times crossing_times.mean()
496.2932551319648
= np.random.normal(loc=0, scale=0.25,
steps = (nwalks, nsteps))
size steps
array([[ 0.0719, 0.1141, -0.0422, ..., 0.6224, 0.0603, -0.1633],
[ 0.3211, -0.1576, 0.016 , ..., -0.2379, 0.2592, -0.0399],
[ 0.1593, 0.4357, 0.147 , ..., 0.0683, -0.1233, 0.0522],
...,
[ 0.177 , 0.4305, 0.1017, ..., -0.3649, -0.2256, 0.1905],
[-0.0539, 0.2377, 0.0203, ..., -0.2376, 0.052 , 0.3039],
[ 0.349 , 0.3813, 0.0644, ..., 0.1646, 0.3622, 0.1421]])
20 Quiz 3
= np.random.RandomState(1234)
rng = rng.standard_normal(100) arr
arr
array([ 0.4714, -1.191 , 1.4327, -0.3127, -0.7206, 0.8872, 0.8596,
-0.6365, 0.0157, -2.2427, 1.15 , 0.9919, 0.9533, -2.0213,
-0.3341, 0.0021, 0.4055, 0.2891, 1.3212, -1.5469, -0.2026,
-0.656 , 0.1934, 0.5534, 1.3182, -0.4693, 0.6756, -1.817 ,
-0.1831, 1.059 , -0.3978, 0.3374, 1.0476, 1.0459, 0.8637,
-0.1221, 0.1247, -0.3228, 0.8417, 2.391 , 0.0762, -0.5664,
0.0361, -2.075 , 0.2478, -0.8972, -0.1368, 0.0183, 0.7554,
0.2153, 0.841 , -1.4458, -1.402 , -0.1009, -0.5482, -0.1446,
0.354 , -0.0355, 0.5657, 1.5457, -0.9742, -0.0703, 0.308 ,
-0.2085, 1.0338, -2.4005, 2.0306, -1.1426, 0.2119, 0.7047,
-0.7854, 0.4621, 0.7042, 0.5235, -0.9263, 2.0078, 0.227 ,
-1.1527, 0.632 , 0.0395, 0.4644, -3.5635, 1.3211, 0.1526,
0.1645, -0.4301, 0.7674, 0.9849, 0.2708, 1.392 , 0.0798,
-0.4 , -1.0279, -0.5847, 0.8166, -0.0819, -0.3448, 0.5283,
-1.069 , -0.5119])
# 0보다 큰 수의 개수
>0).sum() (arr
57
20.1 0보다 큰 모든 수의 합
sum(arr[arr>0]) np.
39.714368245810974
>0].sum() arr[arr
39.714368245810974