ndarray, reshape, zeros, ones, eye, arange, linspace, logspace, seed, .rand, .randn, .choice, .randint, .unique, concatenate, split, vsplit, hsplit, sort

1. ndarray (ndim, shape)

#1차원 행렬
data = np.array([1, 2, 3])

#3차원 행렬
data = np.array(
    [[[1,2,3],
      [4,5,6]],

     [[7,8,9],
      [10,11,12]]]
)

#차원 알기1
data.ndim
=> 3

#차원 알기2
data.shape
=> (2, 2, 3)

2. 행렬의 모양 바꾸기 (reshape)

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

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

3. 데이터 선택

data[1]
=> array([[ 7,  8,  9],
          [10, 11, 12]])

data[1][0]
=> array([7, 8, 9])

data[1][0][2]
data[1,0,2]
=> 9

data[1:, :, 1:]
=> array([[[ 8,  9],
           [11, 12]]])

data[1:, :, 1:].reshape(4)
=> array([ 8,  9, 11, 12])

4. 데이터 수정

data[2] = 0
data[3:] = 5
data[3:] = [6, 7]
data[3:] = [6, 7, 8] #오류!!

5. zeros, zeros_like, ones, ones_like

  • 전부 0 또는 1로 출력
  • 전부 0 또는 1로 초기화 시키기
data = np.zeros((2, 3, 2)) #전부 0 출력
data = np.zeros_like (data) #전부 0로 초기화시킴

data = np.ones((2, 3, 2), dtype = int) #전부 1 출력
data = np.ones_like (data) #전부 1로 초기화시킴

6. 단위행렬

np.eye(5)
=> 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.]])

7. arange (range와 사용방법이 같다.)

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

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

np.arange(1, 10, 2)
=> array([1, 3, 5, 7, 9])

8. linspace, logspace

  • linspace: 선형적으로 분할
  • logspace: 로그로 분할
np.linspace(0, 100, 5)
=> array([  0.,  25.,  50.,  75., 100.])

np.logspace(2, 4, 3)
=> array([  100.,  1000., 10000.])

lin = np.linspace(100000, 1000000, 4) #4등분
=> array([ 100000.,  400000.,  700000., 1000000.])

log = np.logspace(np.log10(100000), np.log10(1000000), 4) #4등분
=> array([ 100000.        ,  215443.46900319,  464158.88336128,
       1000000.        ])

9. 랜덤값 생성 (seed, .rand, .randn, .choice, .randint, .unique)

seed

  • seed값에 따라서 랜덤한 값이 나온다.
np.random.seed(1)
data1 = np.random.randint(10, size = 5)
print(data1)
=> [5 8 9 5 0]

np.random.seed(1)
data2 = np.random.randint(10, size = 5)
print(data2)
=> [5 8 9 5 0]

np.random.seed(2)
data3 = np.random.randint(10, size = 5)
print(data3)
=> [8 8 6 2 8]

random.rand()

  • 0과 1사이의 난수를 발생, 받은 숫자만큼 난수 생성한다.
  • 균등분포로 랜덤한 값이 생성, 랜덤 값의 갯수가 균등하게 뽑히게 한다. ex) 100개뽑을때 구간별로 같은 갯수로
np.random.rand(10)

random.randn()

  • 가우시안 표준 정규 분포
np.random.randn(100)

random.choice()

  • 이미 있는 데이터 집합에서 일부를 무작위로 선택하기
  • numpy.random.choice(a, size=None, replace=True, p=None)
  • a : 배열이면 원래의 데이터, 정수이면 arange(a) 명령으로 데이터 생성
  • size : 정수. 샘플 숫자
  • replace : True이면 한번 선택한 데이터를 다시 선택 가능
  • p : 배열. 각 데이터가 선택될 수 있는 확률
np.random.choice(5, 3, replace=False)  # 3개만 선택
=> array([2, 1, 3])

np.random.choice(5, 10)  # 반복해서 10개 선택
=> array([0, 4, 1, 4, 1, 2, 2, 0, 1, 1])

np.random.choice(5, 10, p=[0.1, 0, 0.4, 0.2, 0.3]) # 선택 확률을 다르게 해서 10개 선택
=> array([0, 3, 3, 4, 2, 4, 2, 4, 4, 2], dtype=int64)

random.randint()

  • 균일 분포의 정수 난수를 발생
  • numpy.random.randint(low, high=None, size=None)
np.random.randint(10, size=10)
=> array([0, 4, 3, 6, 9, 8, 0, 8, 5, 9])

np.random.randint(10, 20, size=10)
=> array([10, 19, 16, 15, 13, 11, 18, 10, 14, 19])

np.random.randint(10, 20, size=(3, 5))
=> array([[16, 15, 17, 18, 18],
          [19, 12, 18, 16, 16],
          [19, 11, 16, 18, 18]])

unique()

np.unique([11, 11, 2, 2, 34, 34])
=> array([ 2, 11, 34])

10. 결합: concatenate

#생성
na1 = np.random.randint(10, size=(2,3))
array([[6, 4, 0],
       [6, 1, 8]])
na2 = np.random.randint(10, size=(3,2))
array([[5, 1],
       [0, 5],
       [0, 9]])
na3 = np.random.randint(10, size=(3,3))
array([[8, 2, 6],
       [9, 9, 8],
       [2, 4, 1]])

#세로결합
np.concatenate((na1, na3))
array([[6, 4, 0],
       [6, 1, 8],
       [8, 2, 6],
       [9, 9, 8],
       [2, 4, 1]])

#가로결합
np.concatenate((na2, na3), axis=1)
array([[5, 1, 8, 2, 6],
       [0, 5, 9, 9, 8],
       [0, 9, 2, 4, 1]])
#벡터 데이터를 컬럼결합
data1 = np.array([1, 2, 3])
data2 = np.array([4, 5, 6])
np.c_[data1, data2]
array([[1, 4],
       [2, 5],
       [3, 6]])
np.r_[data1, data2]
array([1, 2, 3, 4, 5, 6])

11. 행렬나누기

split

data = np.arange(0,30)
np.split(data, [5]) #5번째를 의미한다.
[array([0, 1, 2, 3, 4]),
 array([ 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])]

np.split(data, [5, 10])
[array([0, 1, 2, 3, 4]),
 array([5, 6, 7, 8, 9]),
 array([10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
        27, 28, 29])]

vsplit : 수평으로 자르기

data = np.random.randint(10, size = (4,6))
array([[5, 5, 0, 9, 6, 5],
       [3, 6, 1, 1, 6, 4],
       [2, 7, 6, 3, 6, 2],
       [3, 5, 3, 5, 5, 3]])

data1, data2 = np.vsplit(data, 2)
data1
array([[5, 5, 0, 9, 6, 5],
       [3, 6, 1, 1, 6, 4]])

data2
array([[2, 7, 6, 3, 6, 2],
       [3, 5, 3, 5, 5, 3]])

hsplit : 수직으로 자르기

data1, data2, data3 = np.hsplit(data, 3)
data1
array([[5, 5],
       [3, 6],
       [2, 7],
       [3, 5]])

data2
array([[0, 9],
       [1, 1],
       [6, 3],
       [3, 5]])

data3
array([[6, 5],
       [6, 4],
       [6, 2],
       [5, 3]])

12. 정렬: sort

data
array([[5, 5, 0, 9, 6, 5],
       [3, 6, 1, 1, 6, 4],
       [2, 7, 6, 3, 6, 2],
       [3, 5, 3, 5, 5, 3]])

data.sort()
data
array([[0, 5, 5, 5, 6, 9],
       [1, 1, 3, 4, 6, 6],
       [2, 2, 3, 6, 6, 7],
       [3, 3, 3, 5, 5, 5]])

data.sort(axis = 0)
data
array([[0, 1, 3, 4, 5, 5],
       [1, 2, 3, 5, 6, 6],
       [2, 3, 3, 5, 6, 7],
       [3, 5, 5, 6, 6, 9]])

Quiz_1

- 1 ~ 20 까지 랜덤한 숫자를 가지는 5*5행렬을 만든다.
- 최대값에는 숫자(MAX), 최소값에는 숫자(MIN)값을 치환한다.
data = np.random.randint(1, 21, size=(5,5))
min_number, max_number = np.min(data), np.max(data)
min_number, max_number
=> (1, 19)

min_idx = data == min_number
min_idx
=> array([[False, False, False, False, False],
          [ True, False, False, False, False],
          [False, False, False, False, False],
          [False, False, False, False, False],
          [False,  True, False, False, False]])

max_idx = data == max_number
max_idx
= > array([[ True, False, False, False,  True],
            [False, False, False, False, False],
            [False, False, False, False, False],
            [False, False, False,  True, False],
            [False, False, False, False, False]])

data = data.astype("str") #문자로 타입으로 바꿔주기
data
=> array([['19', '16', '15', '11', '19'],
          ['1', '10', '9', '3', '2'],
          ['7', '18', '4', '3', '3'],
          ['11', '9', '3', '19', '7'],
          ['6', '1', '16', '11', '4']], dtype='<U11')

data[min_idx] = str(min_number) + "(MIN)"
data
=> array([['19', '16', '15', '11', '19'],
          ['1(MIN)', '10', '9', '3', '2'],
          ['7', '18', '4', '3', '3'],
          ['11', '9', '3', '19', '7'],
          ['6', '1(MIN)', '16', '11', '4']], dtype='<U11')

data[max_idx] = str(max_number) + "(MAX)"
data
=> array([['19(MAX)', '16', '15', '11', '19(MAX)'],
          ['1(MIN)', '10', '9', '3', '2'],
          ['7', '18', '4', '3', '3'],
          ['11', '9', '3', '19(MAX)', '7'],
          ['6', '1(MIN)', '16', '11', '4']], dtype='<U11')

Quiz_2

- 100에서 130까지의 랜덤 숫자를 가지는 8*8행렬
- 3의 배수에는 fiz, 5의 배수에는 bux, 3과5의 배수는 fbz문자를 출력
data = np.random.randint(100, 120, size=(8,8))
=> array([[112, 111, 113, 119, 112, 112, 117, 102],
          [116, 117, 112, 100, 100, 119, 102, 105],
          [115, 103, 118, 111, 119, 103, 105, 114],
          [115, 102, 112, 112, 118, 107, 109, 104],
          [109, 111, 104, 112, 107, 108, 105, 112],
          [105, 110, 110, 118, 101, 110, 117, 117],
          [102, 106, 113, 113, 119, 118, 106, 106],
          [119, 106, 113, 110, 110, 103, 118, 113]])

#3의 배수
idx_3 = data % 3 == 0
idx_5 = data % 5 == 0
idx_15 = data % 15 == 0

idx_3
=> array([[ True,  True, False,  True, False,  True, False,  True],
          [ True, False, False,  True, False, False, False,  True],
          [False, False,  True, False,  True, False,  True, False],
          [ True, False, False, False,  True,  True,  True,  True],
          [False, False, False, False, False,  True, False, False],
          [False, False, False,  True, False, False,  True, False],
          [False,  True,  True,  True, False,  True,  True,  True],
          [False, False, False, False,  True, False, False, False]])

data[idx_3] #true 값만 출력
=> array([111, 105, 102, 117, 111, 117, 117, 111, 108, 105, 117, 117, 105,
          102, 105, 102, 108, 105, 114, 117, 111, 114, 111, 102, 105, 114])

#스트링으로 만들어주기.
data = data.astype("str")
data
=> array([['110', '106', '111', '113', '110', '103', '100', '106'],
          ['113', '108', '112', '116', '118', '110', '116', '119'],
          ['115', '118', '104', '109', '104', '102', '103', '110'],
          ['116', '117', '115', '102', '111', '102', '102', '111'],
          ['101', '115', '103', '113', '103', '112', '102', '103'],
          ['103', '115', '103', '104', '100', '108', '106', '114'],
          ['100', '119', '100', '114', '112', '105', '100', '119'],
          ['106', '115', '119', '107', '103', '108', '117', '103']],
          dtype='<U11')

data[idx_3] = "fiz"
=> array([['110', '106', 'fiz', '113', '110', '103', '100', '106'],
          ['113', 'fiz', '112', '116', '118', '110', '116', '119'],
          ['115', '118', '104', '109', '104', 'fiz', '103', '110'],
          ['116', 'fiz', '115', 'fiz', 'fiz', 'fiz', 'fiz', 'fiz'],
          ['101', '115', '103', '113', '103', '112', 'fiz', '103'],
          ['103', '115', '103', '104', '100', 'fiz', '106', 'fiz'],
          ['100', '119', '100', 'fiz', '112', 'fiz', '100', '119'],
          ['106', '115', '119', '107', '103', 'fiz', 'fiz', '103']],
          dtype='<U11')
data[idx_5] = "buz"
=> array([['buz', '106', 'fiz', '113', 'buz', '103', 'buz', '106'],
          ['113', 'fiz', '112', '116', '118', 'buz', '116', '119'],
          ['buz', '118', '104', '109', '104', 'fiz', '103', 'buz'],
          ['116', 'fiz', 'buz', 'fiz', 'fiz', 'fiz', 'fiz', 'fiz'],
          ['101', 'buz', '103', '113', '103', '112', 'fiz', '103'],
          ['103', 'buz', '103', '104', 'buz', 'fiz', '106', 'fiz'],
          ['buz', '119', 'buz', 'fiz', '112', 'buz', 'buz', '119'],
          ['106', 'buz', '119', '107', '103', 'fiz', 'fiz', '103']],
          dtype='<U11')
data[idx_15] = "fbz"
=> array([['buz', '106', 'fiz', '113', 'buz', '103', 'buz', '106'],
          ['113', 'fiz', '112', '116', '118', 'buz', '116', '119'],
          ['buz', '118', '104', '109', '104', 'fiz', '103', 'buz'],
          ['116', 'fiz', 'buz', 'fiz', 'fiz', 'fiz', 'fiz', 'fiz'],
          ['101', 'buz', '103', '113', '103', '112', 'fiz', '103'],
          ['103', 'buz', '103', '104', 'buz', 'fiz', '106', 'fiz'],
          ['buz', '119', 'buz', 'fiz', '112', 'fbz', 'buz', '119'],
          ['106', 'buz', '119', '107', '103', 'fiz', 'fiz', '103']],
          dtype='<U11')