본문 바로가기

Programming

[Python][Library] 1 Numpy - 배열과 벡터

반응형
# # Data 분석을 위한 패키지

# 1. NumPy
#     - Numerical Python
#     - 과학계산용 패키지
#     - 특징
#         - 빠르고 효율적인 다차원 배열 객체 ndarray (n-dimensional array)
#             - `[[1, 2], [1, 2], [[1, 2], [3, 4]]]`
#         - 데이터 분석 시 데이터 컨테이너 역할(데이터를 담는 그릇)
#     - 설치
#         - `pip install numpy`
# 1. pandas
#     - 금융회사에 다니고 있던 Wes McKinney가 처음에 금융 데이터 분석을 위해 설계(2008년)
#     - pandas: 계량 경제학 용어인 Panel Data와 Analysis의 합성어
#     - Panel Data<sup>1</sup>
#         - multi-dimensional data involving measurements over time (Wikipedia)
#     - 구조화된 데이터를 빠르고 쉬우면서 다양한 형식으로 가공할 수 있는 풍부한 자료 구조와 함수를 제공한다.
#     - pandas의 기본 구조는 NumPy로 되어있다.
#     - 설치
#         - `pip install pandas`
# 1. matplotlib/seaborn/bokeh
#     - 시각화 도구
#     - 설치
#         - `pip install matplotlib`
#         - `pip install seaborn`
#         - `pip install bokeh`
#        
# 1. SciPy
#     - 과학 계산용 패키지
#     - 최적화, 선형대수, 적분 등 과학 계산에 쓰이는 대부분이 있음
#     - Numpy extension of Python
#
# 1. scikit-learn
#     - SciPy에 기반한 머신러닝 프레임워크

#

# ---

# # NumPy: 배열과 벡터 계산

# ### NumPy Documentation
#

# #### Numerical Python의 줄임말
#
# 1. 빠르고 효율적인 메모리 사용, 벡터 연산, 브로드캐스팅(확대) 기능을 제공하는 다차원 배열인 ndarray (n dimentional array)를 제공
# 1. for 문 등 반복문을 작성할 필요없이 전체 배열에 대해 빠른 연산을 제공
# 1. 배열 데이터를 디스크에 쓰거나 읽을 수 있는 도구
# 1. 선형대수, 난수 발생기, 푸리에(Fourier) 변환 기능
# 1. C, C++, 포트란 등 다른 언어로 쓰여진 코드를 통합하는 도구

# #### 데이터 분석에서 빠른 연산을 위해 자주 사용하는 기능
#
# 1. 배열에서 데이터 변경, 정제, 부분 집합, 필터링의 빠른 수행
# 2. 정렬, 유일 원소 찾기, 집합 연산
# 3. 통계 표현과 데이터의 수집/요약
# 4. 여러 데이터의 병합, 데이터 정렬과 데이터 조작

# #### 표준 NumPy의 컨벤션을 import numpy as np로 사용

# ---

# # 1. NumPy ndarray: 다차원 배열 객체

# ### 1.1 ndarray 사용

# In[ ]:


import numpy as np


# In[ ]:


lst = [1, -2, -3, 4,  5,  6]


# In[ ]:


arr = np.array(lst)
arr


# In[ ]:


arr * 3


# In[ ]:


arr + arr


# #### <참고> 파이썬 리스트의 산술 연산

# In[ ]:


lst * 3


# In[ ]:


lst + lst


# ### 1.2 ndarray 생성

# In[ ]:


# 1차원 배열
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
arr1


# In[ ]:


# 2차원 배열
data2 = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(data2)
arr2


# In[1]:


arr1.ndim
arr2.ndim


# In[ ]:


arr1.shape
arr2.shape


# In[ ]:


arr2.reshape((4,2))


# In[ ]:


arr2.ravel()


# In[ ]:


arr2.flatten()    # 항상 복사본 생성


# #### <참고> np.array는 생성될 때 적절한 자료형을 선택한다.

# In[ ]:


arr1.dtype
arr2.dtype


# #### np.zeros(): 0 으로 초기화된 배열 생성

# In[ ]:


np.zeros(10)


# In[ ]:


np.zeros((3,6)) ## 3행 6열


# #### np.empty(): 초기화 되지 않은 배열 생성

# In[ ]:


np.empty((2,5))


# #### np.arange(): 파이썬 range() 함수의 배열 버전

# In[ ]:


np.arange(15)


# 함수| 설명
# :---| :---
# array | 입력 데이터(리스트, 튜플, 배열 또는 다른 순차형 데이터)를 ndarray로 변환하며 dtype이 명시되지 않은 경우에는 자료형을 추론하여 저장한다. 기본적으로 입력 데이터는 복사된다.
# asarray | 입력 데이터를 ndarray로 변환하지만 입력 데이터가 이미 ndarray일 경우, 복사가 되지 않는다.
# arange | 내장 range 함수와 유사하지만 리스트 대신 ndarray를 반환한다.
# ones, ones_like | 주어진 dtype과 주어진 모양을 가지는 배열을 생성하고 내용을 모두 1로 초기화한다. ones_like는 주어진 배열과 동일한 모양과 dtype을 가지는 배열을 새로 생성하여 내용을 모두 1로 초기화한다.
# zeros, zeros_like | ones, ones_like와 같지만 내용을 0으로 채운다.
# empty, empty_like | 메모리를 할당하여 새로운 배열을 생성하지만 ones나 zeros처럼 값을 초기화하지는 않는다.
# eye, identity | N x N 크기의 단위 행렬을 생성한다(좌상단에서 우하단을 잇는 대각선은 1로 채워지고 나머지는 0으로 채워진다).

# ### 1.3 ndarray의 자료형

# dtype로 자료형을 알 수 있다.
#
# - 산술 데이터의 dtype은 float, int 같은 자료형의 이름과 하나의 원소가 차지하는 비트로 이루어짐
# - 파이썬의 float 객체에서 사용되는 부동소수점 값은 8바이트 혹은 64바이트로 이루어짐

# In[ ]:


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


# In[ ]:


arr2 = np.array([1,2,3], dtype=np.float64)
arr2


# In[ ]:


arr1.dtype, arr2.dtype


# #### 타입 변경:  astype() 메소드

# In[ ]:


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


# In[ ]:


arr.dtype


# In[ ]:


f_arr = arr.astype(np.float64)
f_arr


# In[ ]:


f_arr.dtype


# In[ ]:


arr.dtype


# In[ ]:


arr = np.array([3.7, -1.2, -2.6, 0.5, 12.9, 10.1])
arr


# In[ ]:


arr.astype(np.int32)


# In[ ]:


num_str = np.array(['1.25', '-9.6', '42'], dtype=np.string_)


# In[ ]:


num_str


# In[ ]:


num_str.astype(float)


# #### <참고> dtype 축약코드
#
# 종류 | Type Code | 설명
# :---|:---|:---
# int8,  uint8  | i1, u1   | 부호가 있는 8비트(1바이트) 정수형과 부호가 없는 8비트 정수형
# int16, uint16 | i2, u2   | 부호가 있는 16비트 정수형과 부호가 없는 16비트 정수형
# int32, uint32 | i4, u4   | 부호가 있는 32비트 정수형과 부호가 없는 32비트 정수형
# int64, uint64 | i8, u8   | 부호가 있는 64비트 정수형과 부호가 없는 64비트 정수형
# float16       | f2       | 반정밀도 부동소수점
# float32       | f4 or f  | 단정밀도 부동소수점 C 언어의 float 형과 호환
# float64       | f8 or d  | 배정밀도 부동소수점 C 언어의 double 형과 파이썬의 float 객체와 호환
# float128      | f16 or g | 확장 정밀도 부동소수점
# bool          | ?        | True, False 값을 저장하는 불리언형
# object        | O        | 파이썬 객체형
# string_       | S        | 고정 길이 문자열형, 길이가 10인 문자열의 dtype은 S10
# unicode_      | U        | 고정 길이 유니코드형(예: U10)
#

# In[ ]:


emp_uint32 = np.empty(8, dtype='u4')
emp_uint32


# ### 1.4 배열과 스칼라 간의 연산

# - **배열은 for 반복문을 작성하지 않고 데이터를 일괄처리할 수 있다(벡터화)**
# - 같은 크기의 배열 간 산술연산은 배열의 각 요소 단위로 적용

# In[ ]:


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


# In[ ]:


arr * 3


# In[ ]:


arr * arr


# In[ ]:


arr - arr


# In[ ]:


1 / arr


# In[ ]:


# **는 square root of x
arr ** 0.5


# ### 1.5 인덱싱(색인)과 슬라이싱

# In[ ]:


arr = np.arange(10)
arr


# In[ ]:


arr[5]


# In[ ]:


arr[5:8]


# In[ ]:


arr[5:8] = 12


# In[ ]:


arr


# #### 브로드캐스팅
# - arr[5:8] = 배열에 스칼라 값을 대입하면 이 값이 필요한 만큼 복사되어 확산 전파
# - 파이썬 리스트는 브로드캐스팅 불가
#
# #### 배열 조각은 원본 배열의 View를 리턴 (파이썬 리스트의 슬라이싱은 복사본을 리턴)
#
# - 즉, 데이터는 복사되지 않으며 뷰에 대한 변경은 그대로 원본 배열에 반영
# - 복사본이 필요할 경우 arr[5:8].copy()를 사용

# #### Slicing : 사용 예
#
# - [:]: 배열 전체
# - [0:n]: 0번째부터 n-1번째까지, 즉 n번 항목은 포함하지 않는다.
# - [:5]: 0번째부터 4번째까지,5번은 포함하지 않는다.
# - [2:]: 2번째부터 끝까지
# - [-1]: 제일 끝에 있는 배열값 반환
# - [-2]: 제일 끝에서 두번째 값 반환

# In[ ]:


arr = np.arange(10)
arr


# In[ ]:


arr_cp = arr[5:8].copy()


# In[ ]:


arr_cp[:] = 128
arr_cp


# In[ ]:


arr


# #### 2차원, 3차원 배열 제어

# In[ ]:


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


# In[ ]:


arr2d.ndim


# In[ ]:


arr2d[2]


# In[ ]:


arr2d[0][2]


# In[ ]:


# ,로도 구분 가능
arr2d[0, 2]


# In[ ]:


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


# In[ ]:


arr3d.ndim


# In[ ]:


arr3d[0]


# In[ ]:


arr_org = arr3d[0].copy()
arr_org


# In[ ]:


arr3d[0] = 42


# In[ ]:


arr3d


# In[ ]:


arr3d[0] = arr_org


# In[ ]:


arr3d


# In[ ]:


arr3d[1, 0]


# #### 슬라이스 색인

# In[ ]:


arr = np.arange(10)
arr


# In[ ]:


arr[1:6]


# In[ ]:


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


# In[ ]:


arr2d[:2]


# #### arr2d[:2, 1:]
#      행,  열
#
# - 같은 [ ] 안에서는 행과 열 구분

# In[ ]:


arr2d[:2, 1:]


# In[ ]:


arr2d[:2][1:]


# In[ ]:


arr2d[1, :2]


# In[ ]:


arr2d[2, :1]


# In[ ]:


arr2d[:, :1]


# In[ ]:


arr2d[:2, 1:] = 0


# In[ ]:


arr2d


# ### 1.6 불리언 색인

# In[ ]:


data = np.arange(28)
data=data.reshape(7,4)


# In[ ]:


data


# In[ ]:


names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])


# In[ ]:


names


# In[ ]:


names == 'Bob'


# In[ ]:


data[names == 'Bob']


# In[ ]:


names2 = np.array(['Bob', 'Joe', 'Will'])


# In[ ]:


names2 == 'Bob'


# In[ ]:


data[names2 == 'Bob']


# In[ ]:


data[names == 'Bob', 2:]


# In[ ]:


data[names == 'Bob', 3]


# #### != ,  ~ 으로 부정

# In[ ]:


names != 'Bob'


# In[ ]:


data[~(names == 'Bob')]


# In[ ]:


names


# In[ ]:


mask = (names == 'Bob') | (names == 'Will')


# In[ ]:


mask


# In[ ]:


data[mask]


# In[ ]:


data[mask, 3:]


# #### 불리언 색인시 항상 데이터 복사
#
# - 파이썬 예약어인 and, or는 불리언 배열에서는 사용 불가

# In[ ]:


data[data < 5] = 0


# In[ ]:


data


# In[ ]:


data[names == 'Bob'] = 7


# In[ ]:


data


# ### 1.7 팬시 색인

# In[ ]:


arr = np.empty((8, 4))


# In[ ]:


for i in range(8):
    arr[i] = i


# In[ ]:


arr


# In[ ]:


# 특정한 순서로 로우 선택
arr[[4, 3, 0, 6]]


# In[ ]:


arr[[-2, -3]]


# In[ ]:


np.arange(32)


# In[ ]:


arr = np.arange(32).reshape((8, 4))


# In[ ]:


arr


# In[ ]:


# 1개 항목을 선택
# (1, 0), (5, 3), (7, 1), (2, 2)에 대응하는 요소가 선택
arr[[1, 5, 7, 2], [0, 3, 1, 2]]


# In[ ]:


# 특정 행들을 선택하고 이의 열의 순서를 바꾸는 경우
# 1, 5, 7, 2 행을 선택
# 컬럼 열에서 :,로 모든 행을 선택해 주어야 한다.
# 0, 3, 1, 2 열을 순서대로 선택

arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]


# In[ ]:


# np.ix_ 사용하는 방법
arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]


# ### 1.8 배열 전치와 축 바꾸기

# In[ ]:


arr = np.arange(15).reshape((3, 5))
arr


# In[ ]:


arr.T # 행과 열을 바꿔준다.


# In[ ]:


arr.transpose() # T와 같은 역할을 한다.


# In[ ]:


arr = np.random.randn(6, 3)
arr


# In[ ]:


arr.T


# In[ ]:


np.dot(arr.T, arr) # arr.T 3 * 6 행렬 곱하기 arr 6 * 3 행렬의 결과값이다.


# ---

# # 2. 유니버설 함수

# - ufunc 유니버설 함수는 ndarray 안에 있는 데이터 원소별로 연산을 수행하는 함수
# - 유니버설 함수는 하나 이상의 스칼라 값을 받아서 하나 이상의 스칼라 결과 값을 반환하는 간단한 함수를 고속으로 수행할 수 있는 벡터화된 래퍼 함수

# ### 2.1 단항 유니버설 함수

# In[ ]:


import numpy as np


# In[ ]:


arr = np.arange(10)


# In[ ]:


np.sqrt(arr)


# In[ ]:


arr


# In[ ]:


np.exp(arr)


# ### 2.2 이항 유니버설 함수

# In[ ]:


x = np.random.randn(8)


# In[ ]:


y = np.random.randn(8)


# In[ ]:


x


# In[ ]:


y


# In[ ]:


np.maximum(x, y)



# ---

# # 3. 배열을 사용한 데이터 처리

# - 반복문 작성하지 않고 간결한 배열연산을 통해 많은 종류의 데이터 처리 작업
# - **벡터화:** 배열연산을 사용해서 반복문을 명시적으로 제거하는 기법
# - 순수 파이썬보다 2~3배, 많게는 수십, 수백 배까지 빠르다.
# - **브로드캐스팅:** 아주 강력한 벡터 연산 방법

# ### 3.1 벡터화

# In[ ]:


import numpy as np


# In[ ]:


points = np.arange(100000, dtype='f')
points[:10]


# In[ ]:


get_ipython().run_cell_magic('time', '', 'total = 0\nfor i in points:\n    total += i\nprint(total)')


# In[ ]:


get_ipython().run_line_magic('time', 'points.sum()')


# ### 3.2 배열연산으로 조건절 표현하기

# In[ ]:


xarr = np.array([1.1, 1.2, 1.3, 1.4, 1.5])
yarr = np.array([2.1, 2.2, 2.3, 2.4, 2.5])
cond = np.array([True, False, True, True, False])


# In[ ]:


result = [(x if c else y) for x, y, c in zip(xarr, yarr, cond)]
result


# In[ ]:


result = np.where(cond, xarr, yarr)
result


# In[ ]:


arr = np.random.randn(4, 4)
arr


# In[ ]:


np.where(arr > 0, 2, -2)


# In[ ]:


np.where(arr > 0, 2, arr)


# ### 3.3 수학 메서드와 통계 메서드

# In[ ]:


arr = np.random.randn(5, 4)
arr


# In[ ]:


arr.mean()


# In[ ]:


np.mean(arr)


# In[ ]:


arr.sum()


# #### 연산을 진행할 축을 선택( 행방향: axis = 0, 열방향: axis = 1) - Default: axis = 0

# In[ ]:


arr.sum(axis=0)


# In[ ]:


arr.sum(0)


# In[ ]:


arr.sum(axis=1)


# In[ ]:


arr.sum(1)


# In[ ]:


arr.mean(axis=1)


# #### 누적연산 - cumsum(), cumprod(): 중간 계산 값을 담고 있는 배열을 반환

# In[ ]:


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


# In[ ]:


arr.cumsum(axis=0)


# In[ ]:


arr.cumprod(axis=1)


# In[ ]:


arr.cumprod(axis=0)


# #### 기본 배열 통계 메서드
#
# 메세드 | 설명
# :---|:---
# sum            | 배열 전체 혹은 특정 축에 대한 모든 원소의 합을 계산한다.
# mean           | 산술평균을 구한다. 크기가 0인 배열에 대한 mean 결과는 NaN이다.
# std, var       | 각각 표준편차와 분산을 구한다.
# min, max       | 최소값, 최대값
# argmin, argmax | 최소 원소의 색인 값, 최대 원소의 색인 값
# cumsum         | 각 원소의 누적 합
# cumprod        | 각 원소의 누적 곱
#

# ### 3.4 불리언 배열을 위한 메서드

# - 불리언 값은 True = 1, False = 0 으로 취급
# - 불리언 배열에 대한 sum 메서드를 실행하면 True인 원소의 개수를 반환

# In[ ]:


arr = np.random.randn(100)


# In[ ]:


(arr > 0).sum()


# In[ ]:


arr[:10]


# In[ ]:


bools = np.array([False, False, True, False])


# In[ ]:


# 하나라도 True 이면 결과는 True
bools.any()


# In[ ]:


# 모두 True 이면 결과는 True
bools.all()


# In[ ]:


bools = np.array([True, True, True, True])


# In[ ]:


bools.any()


# In[ ]:


bools.all()


# #### 배열의 값이 0 이면 False, 그 외 나머지는 모두 True로 취급

# In[ ]:


arr.any()


# In[ ]:


arr.all()


# ### 3.5 정렬

# In[ ]:


arr = np.random.randn(8)
arr


# In[ ]:


# <참고> 원본을 변경하지 않음
np.sort(arr)


# In[ ]:


arr


# In[ ]:


arr.sort()
arr


# #### 다차원 배열의 정렬

# In[ ]:


arr = np.random.randn(5, 3)
arr


# In[ ]:


# axis = 0: 세로방향 정렬(column sort)
arr.sort(axis=0)
arr


# In[ ]:


# axis = 1: 가로방향 정렬(row sort)
arr.sort(axis=1)
arr


# ### 3.6 집합 함수

# In[ ]:


names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])


# In[ ]:


np.unique(names)


# In[ ]:


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


# In[ ]:


np.unique(ints)


# #### np.in1d()

# In[ ]:


values = np.array([6, 0, 0, 3, 2, 5, 6])


# In[ ]:


np.in1d(values, 2)


# In[ ]:


np.in1d(values, [2, 3, 6])


# #### 배열 집합 연산
#
# Method | Comment
# :---|:---
# unique(x)         | 배열 x에서 중복된 원소를 제거한 후 정렬하여 반환한다.
# intersect1d(x, y) | 배열 x와 y에 공통적으로 존재하는 원소를 정렬하여 반환한다.
# union1d(x, y)     | 두 배열의 합집합을 반환한다.
# in1d(x, y)        | x의 원소 중 y의 원소를 포함하는지를 나타내는 불리언 배열을 반환한다.
# setdiff1d(x, y)   | x와 y의 차집합을 반환한다.
# setxor1d(x, y)    | 한 배열에는 포함되지만 두 배열 모두에는 포함되지 않는 원소들의 집합인 대칭차집합을 반환한다.

# ---

# # 4. 배열의 파일 입∙출력

# ### 4.1 배열을 바이너리 형식으로 디스크에 저장하기

# In[ ]:


arr1 = np.arange(10)


# In[ ]:


arr2 = np.arange(5)


# In[ ]:


np.save('data/file_arr1.npy', arr1)


# In[ ]:


arr1_l = np.load('data/file_arr1.npy')
arr1_l


# In[ ]:


np.savez('data/array_archive.npz', a=arr1, b=arr2)


# In[ ]:


arch = np.load('data/array_archive.npz')


# In[ ]:


arch['a']


# In[ ]:


arch['b']


# ### 4.2 텍스트 파일 불러오기와 저장하기

# In[ ]:


arr = np.array( [[2.23342715,-0.37376633,-1.05142871],
                 [-0.57247149,-1.35777871,0.28676036],
                 [-0.01042671,-0.0211314,-0.72049352]])


# In[ ]:


arr


# In[ ]:


np.savetxt('data/array_ex.txt', arr, delimiter=',')


# In[ ]:


arr_l = np.loadtxt('data/array_ex.txt', delimiter=',')


# In[ ]:


arr_l


# ---

# # 5. 선형대수

# In[ ]:


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


# In[ ]:


y = np.array([[6., 23.], [-1, 7], [8, 9]])


# In[ ]:


x


# In[ ]:


y


# In[ ]:


x.shape


# In[ ]:


y.shape


# In[ ]:


# np.dot(x, y)
x.dot(y)


# In[ ]:


from numpy.linalg import inv


# In[ ]:


X = np.random.randn(5, 5)


# In[ ]:


mat = X.T.dot(X)


# In[ ]:


mat


# In[ ]:


inv(mat)  # 행렬을 역행렬으로 변환


# In[ ]:


# 행렬 * 역행렬 = 단위 행렬
mat.dot(inv(mat))


# ---

# # 6. 난수 생성

# In[ ]:


samples = np.random.normal(size=(4, 4))


# In[ ]:


samples


# In[ ]:


import random


# In[ ]:


N = 1000000


# In[ ]:


get_ipython().run_line_magic('time', 'samples = [random.normalvariate(0, 1) for _ in range(N)]')


# In[ ]:


samples[:10]


# In[ ]:


get_ipython().run_line_magic('time', 'samples_arr = np.random.normal(size=N)')


# In[ ]:


samples_arr[:10]


# #### numpy.random 함수
#
# 함수 | 설명
# :---|:---
# seed        | 난수 발생기의 시드를 지정한다.
# permutation | 순서를 임의로 바꾸거나 임의의 순열을 반환한다.
# shuffle     | 리스트나 배열의 순서를 뒤섞는다.
# rand        | 균등분포에서 표본을 추출한다.
# randint     | 주어진 최소/최대 범위 안에서 임의의 난수를 추출한다.
# randn       | 표준편차가 1이고 평균 값이 0인 정규분표에서 표본을 추출한다.
# binomial    | 이항분포에서 표본을 추출한다.
# mormal      | 정규분포에서 표본을 추출한다.
# beta        | 베타분포에서 표본을 추출한다.
# chisquare   | 카이제곱분포에서 표본을 추출한다.
# gamma       | 감마분포에서 표본을 추출한다.
# uniform     | 균등(0,1)분포에서 표본을 추출한다.
#

# ---

# # 7. 예제: 계단 오르내리기

# In[ ]:


import matplotlib.pyplot as plt
get_ipython().run_line_magic('matplotlib', 'inline')


# In[ ]:


import random

position = 0
walk     = [position]
steps    = 1000

for i in range(steps):
    step = 1 if random.randint(0, 1) else -1
    position += step
    walk.append(position)


# In[ ]:


plt.plot(walk[:100])


# In[ ]:





# In[ ]:


nsteps = 1000
draws  = np.random.randint(0, 2, size=nsteps)
steps  = np.where(draws > 0, 1, -1)
walk   = steps.cumsum()


# In[ ]:


plt.plot(walk[:100])


# In[ ]:


walk.min()


# In[ ]:


walk.max()


# In[ ]:


(np.abs(walk) >= 10).argmax()


# In[ ]:


np.abs(walk) >= 10


# ---

# In[ ]:


# end of file


# In[ ]:


반응형
LIST