Numpy
고성능의 과학 계산 컴퓨팅과 데이터 분석에 필요한 패키지이다.
- 빠르고 메모리를 효율적으로 사용하며, 벡터 산술 연산과 세련된 브로드캐스팅 기능을 제공한다.
- 선형 대수, 난수 발생기, 푸리에 변환이 가능하다.
1. ndarray
N 차원을 배열을 생성 할 때 사용
ndarray를 생성할 때 같은 데이터 타입만 허용한다.
import numpy as np
data1 = [6,7,8,0,1]
arr1 = np.array(data1)
print('data1:', data1)
print('arr1', arr1)
print(type(data1))
print(type(arr1))
data2 = [[1,2,3,4], [5,6,7,8]]
arr2 = np.array(data2)
print('arr2 : \n', arr2)
print('dim :', arr2.ndim) # dim : 2
print('shape :', arr2.shape) # shape : (2, 4)
print('dtype:', arr2.dtype) # dtype: int32
arr3 = np.array([1,2,3,4,5], dtype=np.float32)
print('arr3 dtype:', arr3.dtype)
arr3 = arr3.astype(np.int64) # 타입 변한
print('arr3 dtype:', arr3.dtype)
arr4 = np.array(['1.23', '-9.6', '42'],dtype=np.string_)
print(arr4) # [b'1.23' b'-9.6' b'42']
arr4 = arr4.astype(np.float32)
print(arr4) # [ 1.23 -9.6 42. ]
2. 배열과 스칼라간의 연산
numpy 배열은 for문을 작성하지 않고 데이터를 일괄 처리 할 수 있는 벡터화를 지원한다.
print('\n', arr)
print('\n', arr * arr)
print('\n', arr - arr)
print('\n', 1/ arr)
print('\n', arr ** 0.5)
arr2 = np.array([[0., 4., 1. ], [7., 2., 12.]])
print('\n', arr2)
print('\n', arr2 > arr)
# 위 코드의 결과 값
'''
[[1. 2. 3.]
[4. 5. 6.]]
[[ 1. 4. 9.]
[16. 25. 36.]]
[[0. 0. 0.]
[0. 0. 0.]]
[[1. 0.5 0.33333333]
[0.25 0.2 0.16666667]]
[[1. 1.41421356 1.73205081]
[2. 2.23606798 2.44948974]]
[[ 0. 4. 1.]
[ 7. 2. 12.]]
[[False True False]
[ True False True]]
'''
import numpy as np
arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[0])
print(arr[:5])
arr[2:5] = 10
print(arr)
arr2 = np.array(
[[6, 2, 5, 3],
[7, 9, 1, 4]]
)
print(arr2[1][2])
print(arr2[1, 2]) # 배열을 하나 접근 할 때 이 형식을 주로 사용한다.
print(arr2[1, 1:])
print(arr2[:, :2])
'''
1
[1 2 3 4 5]
[ 1 2 10 10 10 6 7 8 9]
1
1
[9 1 4]
[[6 2]
[7 9]]
'''
3. 불리언 색인
import numpy as np
np.random.seed(12345)
names = np.array(['Bob', 'Joe', 'Will', "Bob", 'Bob', 'Joe', 'Will'])
data = np.random.randn(7, 4)
print('\n', names, "\n")
print('\n', data)
print('\n', names == 'Bob')
print('\n', data[names == 'Bob'])
print('\n', data[names == 'Bob', 2:])
print('\n', data[names == 'Bob',])
'''
['Bob' 'Joe' 'Will' 'Bob' 'Bob' 'Joe' 'Will']
[[-0.20470766 0.47894334 -0.51943872 -0.5557303 ]
[ 1.96578057 1.39340583 0.09290788 0.28174615]
[ 0.76902257 1.24643474 1.00718936 -1.29622111]
[ 0.27499163 0.22891288 1.35291684 0.88642934]
[-2.00163731 -0.37184254 1.66902531 -0.43856974]
[-0.53974145 0.47698501 3.24894392 -1.02122752]
[-0.5770873 0.12412128 0.30261356 0.52377207]]
[ True False False True True False False]
[[-0.20470766 0.47894334 -0.51943872 -0.5557303 ]
[ 0.27499163 0.22891288 1.35291684 0.88642934]
[-2.00163731 -0.37184254 1.66902531 -0.43856974]]
[[-0.51943872 -0.5557303 ]
[ 1.35291684 0.88642934]
[ 1.66902531 -0.43856974]]
[[-0.20470766 0.47894334 -0.51943872 -0.5557303 ]
[ 0.27499163 0.22891288 1.35291684 0.88642934]
[-2.00163731 -0.37184254 1.66902531 -0.43856974]]
'''
4. 유니버셜 함수
데이터 요소 별로 수학적 함수를 적용하는 것
import numpy as np
arr = np.arange(10)
print('sqrt: ', np.sqrt(arr), '\n')
print('exp: ', np.exp(arr), '\n')
np.random.seed(12345)
x = np.random.randn(8)
y = np.random.randn(8)
print('x: \n',x, '\n')
print('y: \n', y, '\n')
print('Maxmun x,y : \n')
print(np.maximum(x, y), '\n')
arr = np.random.randn(7) * 5
print(arr, '\n')
print('modf: \n', np.modf(arr), '\n')
'''
sqrt: [0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
exp: [1.00000000e+00 2.71828183e+00 7.38905610e+00 2.00855369e+01
5.45981500e+01 1.48413159e+02 4.03428793e+02 1.09663316e+03
2.98095799e+03 8.10308393e+03]
x:
[-0.20470766 0.47894334 -0.51943872 -0.5557303 1.96578057 1.39340583
0.09290788 0.28174615]
y:
[ 0.76902257 1.24643474 1.00718936 -1.29622111 0.27499163 0.22891288
1.35291684 0.88642934]
Maxmun x,y :
[ 0.76902257 1.24643474 1.00718936 -0.5557303 1.96578057 1.39340583
1.35291684 0.88642934]
[-10.00818655 -1.85921269 8.34512655 -2.19284868 -2.69870723
2.38492505 16.2447196 ]
modf:
(array([-0.00818655, -0.85921269, 0.34512655, -0.19284868, -0.69870723,
0.38492505, 0.2447196 ]), array([-10., -1., 8., -2., -2., 2., 16.]))
'''
5. 재형성
import numpy as np
arr = np.arange(8)
print(arr, '\n')
arr2 = arr.reshape(4,2)
print(arr, '\n')
print(arr2, '\n')
print(arr2.T, '\n')
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])
zarr = np.array([True, False, True, True, False])
result = [x if b == True else y for x, y, b in zip(xarr, yarr, zarr)]
print(result)
# 위 식을 아래와 같이 함축 시킬수 있다. where( condition, arr1, arr2)
result = np.where(zarr, xarr, yarr)
print(result)
'''
[0 1 2 3 4 5 6 7]
[0 1 2 3 4 5 6 7]
[[0 1]
[2 3]
[4 5]
[6 7]]
[[0 2 4 6]
[1 3 5 7]]
[1.1, 2.2, 1.3, 1.4, 2.5]
[1.1 2.2 1.3 1.4 2.5]
'''
6. 수학 메소드와 통계 메소드
import numpy as np
arr = np.random.randn(5, 4)
print('\n', arr)
print('\nmean1 : ', arr.mean()) # 평균 구하기
print('\nmean2 : ', np.mean(arr))
print('\nsum : ', arr.sum()) # total sum
print('\n', arr.mean(axis=1)) # axis = 0 , Row
print('\n', arr.sum(axis=0)) # axis = 1 , Column
arr = np.array([0, 1, 2, 3, 4, 5, 6, 7])
print('\n', arr.cumsum()) # 누적 합
arr = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
print('\n', arr.cumsum(axis=0))
print('\n', arr.cumprod(axis=1))
'''
[[-0.79563133 -1.17517227 0.62650881 -1.0231121 ]
[ 1.01007041 -1.98169661 -0.92232807 0.29811058]
[ 0.28212076 -0.65852621 -0.03278394 0.97964221]
[ 0.50173792 1.39187473 0.41808586 -0.90839659]
[-0.34202882 -1.18326469 -0.76332477 -0.18529098]]
mean1 : -0.22317025430414433
mean2 : -0.22317025430414433
sum : -4.463405086082886
[-0.59185172 -0.39896092 0.14261321 0.35082548 -0.61847731]
[ 0.65626894 -3.60678504 -0.67384211 -0.83904687]
[ 0 1 3 6 10 15 21 28]
[[ 0 1 2]
[ 3 5 7]
[ 9 12 15]]
[[ 0 0 0]
[ 3 12 60]
[ 6 42 336]]
'''
6.1 불리언 배열을 위한 메소드
import numpy as np
np.random.seed(12345)
arr = np.random.randn(100)
print((arr>0).sum())
bools = np.array([[False, False,True,False], [False, False, True, False]])
print(bools.any(axis=1)) # any는 하나라도 true이면 true를 리턴
print(bools.all(axis=0))
data = np.random.randn(10,4)
data = data * 2
print('\n', data)
print('\n',data[(data>3).any(axis=1)]) # 연관된 record를 가져온다.
'''
[[-1.17897537 3.16340019 -1.05746965 0.91400374]
[ 3.26947241 1.9780166 0.91588029 1.11030882]]
'''
6.2 정렬
numpy 정렬은 각 개별적으로 sorting 되기 때문에 연관된 data에 대해서는 적합하지 않다.
import numpy as np
arr = np.random.randn(5,3)
print('\n', arr)
arr.sort(axis=1)
print('\n', arr)
arr.sort(axis=0)
print('\n', arr)
6.2.1 간접 정렬
import numpy as np
np.random.seed(12345)
values = np.array([5,0,1,3,2])
indexer = values.argsort()
print(indexer)
print(values[indexer])
data = np.random.rand(3,5)
data[0] = values
print(data)
print('\n', data[:, data[0].argsort()])
'''
[1 2 4 3 0]
[0 1 2 3 5]
[[5. 0. 1. 3. 2. ]
[0.5955447 0.96451452 0.6531771 0.74890664 0.65356987]
[0.74771481 0.96130674 0.0083883 0.10644438 0.29870371]]
[[0. 1. 2. 3. 5. ]
[0.96451452 0.6531771 0.65356987 0.74890664 0.5955447 ]
[0.96130674 0.0083883 0.29870371 0.10644438 0.74771481]]
'''
6.3 집합 함수
- unique
- union
- diff.
- intersect
import numpy as np
names = np.array((['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']))
print('\n', np.unique(names))
ints = np.array([3,3,3,2,2,1,1,4,4])
print('\n', np.unique(ints)) # 정렬까지 기본으로 해준다.
values = np.array([6,0,0,3,2,5,6])
print('\n', np.in1d(values, [2,3,6])) # Contain이랑 비슷하게 동작 , A[index] in B ??
print('\n', np.union1d(values, [2,3,6])) # #교집합
print('\n', np.intersect1d(values, [2,3,6])) # 합집합
print('\n', np.setdiff1d(values, [2,3,6])) # 차집합
6.4 고급 배열
6.4.1 집합 합치기
import numpy as np
np.random.seed(12345)
arr1 = np.arange(1,7).reshape(2,3)
arr2 = np.arange(7,13).reshape(2,3)
print(arr1)
print('\n', arr2)
print('\n', np.concatenate([arr1, arr2], axis=0))
print('\n', np.concatenate([arr1, arr2], axis=1))
print('\n', np.vstack([arr1, arr2])) #vertical
print('\n', np.vstack([arr1, arr2])) #horizontal
print('\n', np.r_[arr4,arr5]) #vertical
print('\n', np.r_[arr4,arr5]) # horizontal
print('\n', np.c_[np.r_[arr4, arr5], arr3])
댓글남기기