티스토리 뷰

beginner/파이썬 기초

NumPy_랜덤-1

johh 2019. 2. 12. 13:50
2019.02.12-2

NumPy 랜덤 생성 함수

  • np.random.rand()
  • np.random.randn()
  • np.random.randint()
  • np.random.normal()
  • np.random.uniform()
  • np.random.permutation()
  • np.random.choice()
  • np.random.seed()
In [1]:
import numpy as np
import matplotlib.pyplot as plt

randn()

  • 0~1 사이의 임의의 실수 선택(1은 제외)
In [18]:
a = np.random.rand(5,5) #[0,1] 구간의 임의의 실수 선택
a
Out[18]:
array([[0.92766857, 0.9842186 , 0.42338498, 0.34811212, 0.60982959],
       [0.08511231, 0.85537634, 0.17219557, 0.44931633, 0.49067387],
       [0.14068273, 0.54299453, 0.16601103, 0.63835497, 0.17526077],
       [0.34705063, 0.91143692, 0.4681624 , 0.33261273, 0.91087165],
       [0.49162764, 0.40629183, 0.93981343, 0.59752644, 0.10748974]])
In [19]:
a>0.5
Out[19]:
array([[ True,  True, False, False,  True],
       [False,  True, False, False, False],
       [False,  True, False,  True, False],
       [False,  True, False, False,  True],
       [False, False,  True,  True, False]])
In [20]:
a.mean()
Out[20]:
0.5008830300875639
In [21]:
(a>0.5).sum(), (a>0.5).mean()
Out[21]:
(10, 0.4)
In [34]:
a2 = np.random.rand(100)

plt.hist(a2)
plt.title('Histogram - rand()')
Out[34]:
Text(0.5,1,'Histogram - rand()')
In [35]:
a2 = np.random.rand(1000)

plt.hist(a2)
plt.title('Histogram - rand()')
Out[35]:
Text(0.5,1,'Histogram - rand()')
In [36]:
a2 = np.random.rand(10000)

plt.hist(a2)
plt.title('Histogram - rand()')
Out[36]:
Text(0.5,1,'Histogram - rand()')

randn()

n : normal distribution

  • 평균이 0, 표준편차가 1인 임의의 실수 선택
In [39]:
a = np.random.randn(5,5)
a
Out[39]:
array([[-0.4971687 , -0.53043531, -0.49431335, -0.32969942, -0.52433321],
       [-1.39857446, -0.19711835,  0.20112582,  0.54544951,  0.89899657],
       [ 0.94879027, -1.29984712, -2.58341546,  1.99445961,  1.95731269],
       [-0.05617985, -0.51832046, -0.40420292, -0.8531454 ,  0.94010335],
       [ 0.87448289,  0.46436625,  0.56299234, -1.70959297,  0.03708814]])
In [43]:
a.mean()
Out[43]:
-0.07884718214607524
In [44]:
a>0
Out[44]:
array([[False, False, False, False, False],
       [False, False,  True,  True,  True],
       [ True, False, False,  True,  True],
       [False, False, False, False,  True],
       [ True,  True,  True, False,  True]])
In [45]:
(a>0).sum(), (a>0).mean()
Out[45]:
(11, 0.44)
In [59]:
a[a>1]
Out[59]:
array([1.99445961, 1.95731269])
In [55]:
a2 = a.copy()       # 이상치(outlier) 처리
a2[a2>1] = 1
a2
Out[55]:
array([[-0.4971687 , -0.53043531, -0.49431335, -0.32969942, -0.52433321],
       [-1.39857446, -0.19711835,  0.20112582,  0.54544951,  0.89899657],
       [ 0.94879027, -1.29984712, -2.58341546,  1.        ,  1.        ],
       [-0.05617985, -0.51832046, -0.40420292, -0.8531454 ,  0.94010335],
       [ 0.87448289,  0.46436625,  0.56299234, -1.70959297,  0.03708814]])
In [57]:
an = np.random.randn(100)

plt.hist(an, bins=30)   # bins : 구간을 몇개로 줄 것이냐.
plt.title('Histogram - randn()')
Out[57]:
Text(0.5,1,'Histogram - randn()')
In [64]:
an = np.random.randn(10000)

plt.hist(an, bins=60)
plt.title('Histogram - randn()')
Out[64]:
Text(0.5,1,'Histogram - randn()')
In [65]:
an.max(), an.min()
Out[65]:
(4.498835372898621, -3.615396051468521)

randint()

  • 범위 안의 정수 선택
In [77]:
a = np.random.randint(10, size=[5,3])  # 0 ~ 9의 정수를 뽑아라
a
Out[77]:
array([[3, 8, 8],
       [7, 5, 5],
       [3, 4, 1],
       [2, 6, 1],
       [1, 9, 7]])
In [78]:
a.mean()
Out[78]:
4.666666666666667
In [79]:
a.mean(axis=0)   
#  axis=0 이면 a의 각 열의 평균을 구한다.
Out[79]:
array([3.2, 6.4, 4.4])
In [81]:
a.mean(axis=1)
# axis=1 이면 a의 각 행의 평균을 구한다.
Out[81]:
array([6.33333333, 5.66666667, 2.66666667, 3.        , 5.66666667])

모의실험

In [83]:
a= np.random.randint(2, size=[1000,100])  # 동전 던지기
a[:10,:10]  # 일부만 뽑겠다
Out[83]:
array([[0, 1, 1, 0, 0, 0, 1, 0, 0, 0],
       [1, 0, 0, 0, 0, 0, 1, 1, 1, 1],
       [0, 1, 0, 0, 1, 1, 1, 0, 1, 1],
       [0, 1, 1, 1, 0, 0, 1, 1, 1, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 1, 1, 0, 1, 0, 0, 1],
       [1, 0, 0, 1, 0, 1, 1, 1, 1, 0],
       [1, 0, 0, 1, 1, 0, 0, 1, 1, 1],
       [1, 0, 0, 1, 1, 1, 1, 1, 0, 1],
       [0, 0, 1, 0, 1, 1, 0, 1, 1, 1]])
In [85]:
a.mean()
Out[85]:
0.49891
In [87]:
coin_count = a.sum(axis=1)
coin_count[:100]
Out[87]:
array([48, 43, 51, 53, 49, 60, 53, 53, 49, 52, 54, 60, 45, 57, 53, 50, 44,
       54, 45, 47, 47, 51, 54, 45, 50, 56, 56, 54, 47, 46, 47, 50, 36, 55,
       57, 45, 57, 42, 42, 54, 56, 60, 56, 54, 55, 46, 55, 57, 58, 46, 46,
       44, 43, 46, 54, 39, 49, 45, 44, 54, 45, 51, 52, 50, 41, 48, 57, 47,
       56, 47, 51, 45, 55, 47, 53, 52, 52, 49, 49, 49, 49, 51, 50, 43, 43,
       48, 47, 56, 48, 39, 45, 44, 46, 55, 55, 54, 50, 49, 50, 48])
In [88]:
plt.hist(coin_count, bins=range(101)) ## 동전 나온 횟수가 몇번씩 나왔는지. 
Out[88]:
(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.,  0.,  0.,  0.,  1.,  0.,  1.,  6.,  4.,  4.,
        10.,  9., 14., 24., 33., 48., 51., 49., 63., 79., 73., 84., 76.,
        60., 58., 65., 47., 40., 30., 23., 13., 17.,  5.,  3.,  3.,  6.,
         1.,  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.,  0.,  0.,  0.,  0.]),
 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,  32,  33,  34,  35,  36,  37,  38,
         39,  40,  41,  42,  43,  44,  45,  46,  47,  48,  49,  50,  51,
         52,  53,  54,  55,  56,  57,  58,  59,  60,  61,  62,  63,  64,
         65,  66,  67,  68,  69,  70,  71,  72,  73,  74,  75,  76,  77,
         78,  79,  80,  81,  82,  83,  84,  85,  86,  87,  88,  89,  90,
         91,  92,  93,  94,  95,  96,  97,  98,  99, 100]),
 <a list of 100 Patch objects>)

randint를 이용해 게임을 해볼 수 있다. randint(2)는 동전, randint(6)은 주사위, randint(53)은 카드 등 여러가지 모의 실험을 할 수 있다.

normal()

uniform()

  • 정해진 범위 내에서 실수 선택
In [93]:
a = np.random.uniform(100,200,50)
a
Out[93]:
array([138.17033491, 168.47592103, 127.03498421, 139.98131131,
       102.67622049, 118.3830622 , 156.44681617, 107.65627787,
       195.34642029, 166.31982547, 153.63673777, 178.30184799,
       156.4527894 , 164.0955714 , 121.02149154, 147.93595549,
       163.59700998, 109.20601878, 150.92453317, 173.15197645,
       179.98581027, 183.32185091, 107.26933735, 124.62672445,
       122.91906935, 188.0785659 , 116.89512713, 195.74167026,
       157.2651663 , 171.61210628, 109.74797212, 114.83726578,
       142.50007354, 186.86376879, 195.37349837, 134.85181034,
       147.32772976, 133.19171623, 187.59029581, 132.91989349,
       180.50707015, 174.65798006, 185.23550153, 147.49269964,
       184.24223966, 173.62419163, 144.14256755, 185.98608278,
       128.67411883, 172.03034175])

permutation()

  • 숫자를 임의로 섞는다
  • 중복되지 않은 인덱스를 뽑아 낼 수 있다.
In [94]:
a = np.arange(100)
a
Out[94]:
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, 32, 33,
       34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50,
       51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67,
       68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
       85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])
In [97]:
a2 = np.random.permutation(a) # 기존의 값들을 마음대로 섞어버리기
a2
Out[97]:
array([62, 21, 43, 36, 79, 74, 76, 81, 65, 11, 98, 57, 40, 78, 86, 96, 99,
       25, 94, 83,  3, 64, 84, 38, 56, 29, 61, 52, 18, 12,  9, 50, 13, 30,
       26, 82, 80, 35,  2, 70, 71, 54, 88, 14, 91, 45, 28, 77,  5,  1, 34,
       17, 53, 20, 31, 67, 87, 63, 59, 66, 89,  6, 60, 41, 95, 27,  8, 69,
       68, 15, 73, 19, 32, 92, 42, 44, 58, 48, 46, 51, 49,  7, 72, 85, 37,
       24, 55, 97,  0, 47,  4, 75, 33, 10, 23, 22, 39, 16, 93, 90])

150개 iris에 permutation을 사용한다는 의미는 임의의 sample을 뽑는다는 것을 의미한다.

'beginner > 파이썬 기초' 카테고리의 다른 글

NumPy_사칙연산  (0) 2019.02.13
NumPy_랜덤-2  (0) 2019.02.13
NumPy_생성하기  (0) 2019.02.12
함수와 모듈  (0) 2019.02.11
NumPy_잘라내기  (0) 2019.02.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
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
글 보관함