Python/Numpy

Numpy_04

BSHwan 2019. 8. 11. 17:17
반응형
day2_Numpy01
In [1]:
import numpy as np

Numpy 배열의 Boolean Indexing

  • 다수개의 배열에서 특정 값을 추출할 때 사용한다.
  • 배열이름[조건]
  • TRUE, FALSE로 값이 표시된다.

names ndArray 배열에서 True, False로 표시된다.

In [2]:
names = np.array(['Charles','Jhon', 
                  'Hayoung','Charles',
                  'Hayoung','Jhon',
                  'Elise'])
names
Out[2]:
array(['Charles', 'Jhon', 'Hayoung', 'Charles', 'Hayoung', 'Jhon',
       'Elise'], dtype='<U7')

True/False로 구성된 ndArray 생성

In [3]:
names == 'Charles'
Out[3]:
array([ True, False, False,  True, False, False, False])

다른 ndArray 배열에 배열[조건식]으로 적용

In [5]:
# 실수형 난수 7행4열 
data = np.random.randn(7,4)
data
Out[5]:
array([[ 0.33529922, -1.09067658,  0.81281499, -0.1686352 ],
       [-0.53128127, -0.17384504,  0.29539424,  1.56338063],
       [-0.23182723, -2.4868293 ,  0.96668536,  0.23462743],
       [-1.6083009 , -0.71478333,  0.60885139,  1.44656971],
       [-0.63490275, -0.1067609 ,  0.26016152, -0.38219238],
       [ 0.27332922, -2.15521025,  2.38035982,  0.83158006],
       [-0.59936894, -1.20329044, -0.73625356,  1.68638138]])

data에서 names 의 True 값이 적용된 1, 4행 만 추출

In [6]:
data[names=='Charles']
Out[6]:
array([[ 0.33529922, -1.09067658,  0.81281499, -0.1686352 ],
       [-1.6083009 , -0.71478333,  0.60885139,  1.44656971]])
In [7]:
names == 'Jhon'
Out[7]:
array([False,  True, False, False, False,  True, False])

True 값이 적용된 2, 6행 만 추출

In [8]:
data[names=='Jhon']
Out[8]:
array([[-0.53128127, -0.17384504,  0.29539424,  1.56338063],
       [ 0.27332922, -2.15521025,  2.38035982,  0.83158006]])

| 연산자 이용하기

  • 조건식1 | 조건식2 : OR 합집합
In [9]:
names
Out[9]:
array(['Charles', 'Jhon', 'Hayoung', 'Charles', 'Hayoung', 'Jhon',
       'Elise'], dtype='<U7')
In [10]:
(names == "Charles")| (names=='Jhon')
Out[10]:
array([ True,  True, False,  True, False,  True, False])

True 값이 적용된 1,2, 4,6행 만 추출

In [11]:
data[(names == "Charles")| (names=='Jhon')]
Out[11]:
array([[ 0.33529922, -1.09067658,  0.81281499, -0.1686352 ],
       [-0.53128127, -0.17384504,  0.29539424,  1.56338063],
       [-1.6083009 , -0.71478333,  0.60885139,  1.44656971],
       [ 0.27332922, -2.15521025,  2.38035982,  0.83158006]])

마스크 적용 후 true 값 갯수 구하기

  • (조건).sum()
In [12]:
data = np.random.randn(3,3)
data
Out[12]:
array([[-1.56812402, -0.148591  , -0.5383728 ],
       [-0.52120365,  0.41711423, -1.32203305],
       [-0.38754971,  0.13249254, -0.15797014]])
In [13]:
data > 0
Out[13]:
array([[False, False, False],
       [False,  True, False],
       [False,  True, False]])
In [14]:
(data>0).sum()
Out[14]:
2

Boolean Index를 자기자신의 넘파이배열에 적용

  • 조건식을 만족하는 실제 값을 얻을 수 있다
In [15]:
data[data>0]
Out[15]:
array([0.41711423, 0.13249254])

퀴즈

1~100 의 숫자중 20개를 난수로 추출한 후 
4행 5열의 넘파이 배열로 생성한다. 
이중 50이 넘은 숫자만 추출한다.
In [27]:
numlist = np.random.randint(1,101, size=20)
numlist
Out[27]:
array([ 27,  20,   8,  72,  75,  34,  36,  55, 100,  40,  60,  40,  65,
        45,  15,  19,  78,  90,  50,  43])
In [28]:
numlist = numlist.reshape(4,5)
numlist
Out[28]:
array([[ 27,  20,   8,  72,  75],
       [ 34,  36,  55, 100,  40],
       [ 60,  40,  65,  45,  15],
       [ 19,  78,  90,  50,  43]])
In [29]:
numlist[numlist>50]
Out[29]:
array([ 72,  75,  55, 100,  60,  65,  78,  90])

Quiz

상위 5퍼센트에 해당하는 숫자 추출하기

  • 난수 50개 정도 : np.random.randn(50)
  • 내림차순으로 소팅 ; np.sort(배열명)[::-1]
  • 전체갯수에서 5퍼센트에 해당하는 인덱스 구하기 int(0.05*len(배열))
  • 배열명[0:n]

- 50개의 난수값으로 구성된 넘파이 배열 생성하기

In [30]:
large_arr = np.random.randn(50)
large_arr
Out[30]:
array([ 0.5581536 , -0.60766896, -0.03302451, -0.07317858, -0.38217587,
       -1.26863817, -0.29385434, -0.85444763,  0.74496812,  0.28886653,
        0.12771564, -0.0315927 , -1.25072206,  1.71317599, -0.43009879,
        1.30304886,  0.20358314,  0.57677134,  1.48095288, -0.90094574,
       -0.28265986, -1.07309941, -1.09248729,  0.78698358, -0.37198776,
       -0.20325167, -0.76751229,  0.85811982, -0.60003311, -1.04194116,
        1.47124626,  0.45627331, -0.15371065,  1.47582057,  0.92638364,
       -1.30485526, -0.24717358, -0.03842676, -0.45823071,  1.1773135 ,
        1.29463572, -0.18955137,  0.07426073, -0.48616175,  0.98355847,
        0.42178276, -0.23145736, -0.67746016,  0.28400091, -0.17871994])

- 내림차순으로 소팅 : np.sort(배열명)[::-1]

In [32]:
large_arr2 = np.sort(large_arr)[::-1]
large_arr2
Out[32]:
array([ 1.71317599,  1.48095288,  1.47582057,  1.47124626,  1.30304886,
        1.29463572,  1.1773135 ,  0.98355847,  0.92638364,  0.85811982,
        0.78698358,  0.74496812,  0.57677134,  0.5581536 ,  0.45627331,
        0.42178276,  0.28886653,  0.28400091,  0.20358314,  0.12771564,
        0.07426073, -0.0315927 , -0.03302451, -0.03842676, -0.07317858,
       -0.15371065, -0.17871994, -0.18955137, -0.20325167, -0.23145736,
       -0.24717358, -0.28265986, -0.29385434, -0.37198776, -0.38217587,
       -0.43009879, -0.45823071, -0.48616175, -0.60003311, -0.60766896,
       -0.67746016, -0.76751229, -0.85444763, -0.90094574, -1.04194116,
       -1.07309941, -1.09248729, -1.25072206, -1.26863817, -1.30485526])

전체 길이를 구한 후 상위 5프로 , 0.05를 곱한 후 정수형으로 변환

In [33]:
# 전체길이 
len(large_arr)
Out[33]:
50
In [34]:
# 5퍼센트에 해당하는 인덱스 구하기 
n = int(0.05*len(large_arr))
n
Out[34]:
2

상위 5프로에 해당하는 인덱스까지 추출

In [35]:
large_arr2[0:n]
Out[35]:
array([1.71317599, 1.48095288])

외부 파일 이용하기

배열명 = np.loadtxt('파일경로', delimeter='구분자', dtype=데이터형)

np.savetxt('파일경로', 배열이름, fmt='포맷형식', delimeter='구분자')

샘플자료 : ratings.dat

``` movieLens : 영화에 대한 평점 데이타

 아이디    영화번호     평점      ?

[ 1, 1193, 5, 978300760]

실제 데이타 형태는?

1 :: 1193 :: 5 :: 978300760

```

dat 파일불러온 후 5개만 표시하기

In [40]:
data = np.loadtxt('data/ratings.dat', delimiter='::', dtype=np.int64)
data[:5, :]
Out[40]:
array([[        1,      1193,         5, 978300760],
       [        1,       661,         3, 978302109],
       [        1,       914,         3, 978301968],
       [        1,      3408,         4, 978300275],
       [        1,      2355,         5, 978824291]], dtype=int64)
In [41]:
# 데이타 전체 구조 확인 
data.shape
Out[41]:
(1000209, 4)

3열 평점 데이타를 10개만 추출하기

In [43]:
data[:10, 2]
Out[43]:
array([5, 3, 3, 4, 5, 3, 5, 5, 4, 4], dtype=int64)

3열의 평균구하기

In [44]:
mean_rating_total = data[:,2].mean()
mean_rating_total
Out[44]:
3.581564453029317

csv 파일로 10개만 추출해서 저장하기

In [48]:
data = np.loadtxt('data/ratings.dat', delimiter='::', dtype=np.int64)
data = data[:10, :]
data
Out[48]:
array([[        1,      1193,         5, 978300760],
       [        1,       661,         3, 978302109],
       [        1,       914,         3, 978301968],
       [        1,      3408,         4, 978300275],
       [        1,      2355,         5, 978824291],
       [        1,      1197,         3, 978302268],
       [        1,      1287,         5, 978302039],
       [        1,      2804,         5, 978300719],
       [        1,       594,         4, 978302268],
       [        1,       919,         4, 978301368]], dtype=int64)
In [49]:
np.savetxt("data/data.csv", data, fmt='%.3f', delimiter=',')
반응형