Numercial Python의 줄임말로 고성능의 과학계산 컴퓨팅과 데이터 분석에 필요한 기본 패키지다. 다음과 같은 기능을 제공한다.
대부분의 데이터 분석 애플리케이션에서 중요하게 사용되는 기능은 다음과 같다
import numpy as np
data = np.array([[0.9526, -0.246, -0.8856],
[0.5639, 0.2379, 0.9104]])
data * 10
array([[ 9.526, -2.46 , -8.856], [ 5.639, 2.379, 9.104]])
data + data
array([[ 1.9052, -0.492 , -1.7712], [ 1.1278, 0.4758, 1.8208]])
data.shape
(2, 3)
data.dtype
dtype('float64')
import numpy as np
# 10^7개의 원소를 갖는 배열 생성
arr = np.arange(1e7)
# ndarray를 리스트로 변환
larr = arr.tolist()
# 리스트는 브로드캐스트가 불가능하다
# 그래서 ndarray의 브로드캐스트를 흉내 내는 함수를 제작
def list_times(alist, scalar):
for i, val in enumerate(alist):
alist[i] = val * scalar
return alist
%timeit arr * 1.1
10 loops, best of 3: 118 ms per loop
%timeit list_times(larr, 1.1)
1 loops, best of 3: 1.13 s per loop
# 약 9.6배 빠르다(실행 환경마다 다를 수 있음)
1.13 * 1000 / 118.0
9.576271186440678
alist = [1, 2, 3]
arr = np.array(alist)
arr
array([1, 2, 3])
# 0으로 초기화된 5개의 원소를 갖는 배열을 생성
arr = np.zeros(5)
arr
array([ 0., 0., 0., 0., 0.])
# 0부터 99까지를 원소로 하는 배열
arr = np.arange(100)
arr
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])
# 10부터 99
arr = np.arange(10,100)
arr
array([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])
# 0부터 1까지 100단계로
arr = np.linspace(0, 1, 100)
arr
array([ 0. , 0.01010101, 0.02020202, 0.03030303, 0.04040404, 0.05050505, 0.06060606, 0.07070707, 0.08080808, 0.09090909, 0.1010101 , 0.11111111, 0.12121212, 0.13131313, 0.14141414, 0.15151515, 0.16161616, 0.17171717, 0.18181818, 0.19191919, 0.2020202 , 0.21212121, 0.22222222, 0.23232323, 0.24242424, 0.25252525, 0.26262626, 0.27272727, 0.28282828, 0.29292929, 0.3030303 , 0.31313131, 0.32323232, 0.33333333, 0.34343434, 0.35353535, 0.36363636, 0.37373737, 0.38383838, 0.39393939, 0.4040404 , 0.41414141, 0.42424242, 0.43434343, 0.44444444, 0.45454545, 0.46464646, 0.47474747, 0.48484848, 0.49494949, 0.50505051, 0.51515152, 0.52525253, 0.53535354, 0.54545455, 0.55555556, 0.56565657, 0.57575758, 0.58585859, 0.5959596 , 0.60606061, 0.61616162, 0.62626263, 0.63636364, 0.64646465, 0.65656566, 0.66666667, 0.67676768, 0.68686869, 0.6969697 , 0.70707071, 0.71717172, 0.72727273, 0.73737374, 0.74747475, 0.75757576, 0.76767677, 0.77777778, 0.78787879, 0.7979798 , 0.80808081, 0.81818182, 0.82828283, 0.83838384, 0.84848485, 0.85858586, 0.86868687, 0.87878788, 0.88888889, 0.8989899 , 0.90909091, 0.91919192, 0.92929293, 0.93939394, 0.94949495, 0.95959596, 0.96969697, 0.97979798, 0.98989899, 1. ])
# 로그 스케일로 1부터 10까지 100단계로
arr = np.logspace(0, 1, 100, base=10.0)
arr
array([ 1. , 1.02353102, 1.04761575, 1.07226722, 1.09749877, 1.12332403, 1.149757 , 1.17681195, 1.20450354, 1.23284674, 1.26185688, 1.29154967, 1.32194115, 1.35304777, 1.38488637, 1.41747416, 1.45082878, 1.48496826, 1.51991108, 1.55567614, 1.59228279, 1.62975083, 1.66810054, 1.70735265, 1.7475284 , 1.78864953, 1.83073828, 1.87381742, 1.91791026, 1.96304065, 2.009233 , 2.05651231, 2.10490414, 2.15443469, 2.20513074, 2.25701972, 2.3101297 , 2.36448941, 2.42012826, 2.47707636, 2.53536449, 2.59502421, 2.65608778, 2.71858824, 2.7825594 , 2.84803587, 2.91505306, 2.98364724, 3.05385551, 3.12571585, 3.19926714, 3.27454916, 3.35160265, 3.43046929, 3.51119173, 3.59381366, 3.67837977, 3.76493581, 3.85352859, 3.94420606, 4.03701726, 4.1320124 , 4.22924287, 4.32876128, 4.43062146, 4.53487851, 4.64158883, 4.75081016, 4.86260158, 4.97702356, 5.09413801, 5.21400829, 5.33669923, 5.46227722, 5.59081018, 5.72236766, 5.85702082, 5.9948425 , 6.13590727, 6.28029144, 6.42807312, 6.57933225, 6.73415066, 6.8926121 , 7.05480231, 7.22080902, 7.39072203, 7.56463328, 7.74263683, 7.92482898, 8.11130831, 8.30217568, 8.49753436, 8.69749003, 8.90215085, 9.11162756, 9.32603347, 9.54548457, 9.77009957, 10. ])
# 5x5 형식의, 0으로 채워진 배열(이미지) 만들기
image = np.zeros((5,5))
image
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.]])
# 5x5x5 형식의, 1로 채워진 배열을 만든다.
# astype() 메서드는 원소들을 정수로 설정한다.
cube = np.zeros((5,5,5)).astype(int) + 1
cube
array([[[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]], [[1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1], [1, 1, 1, 1, 1]]])
# 16비트 부동소수점으로
cube = np.ones((5, 5, 5)).astype(np.float16)
cube
array([[[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]], [[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]], [[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]], [[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]], [[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]]], dtype=float16)
arr = np.ones((10,5))
arr
array([[ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.], [ 1., 1., 1., 1., 1.]])
# 배열의 형태를 나타내는 튜플
arr.shape
(10, 5)
# 자료형
arr.dtype
dtype('float64')
# 하나의 원소에서 다음 원소까지의 너비를 표현한 정수를 담고 있는 stride 튜플
# 스트라이드 값은 배열을 복사하지 않고 뷰를 생성하기 위한 필수 값으로 사용된다.
arr.strides
(40, 8)
# dtype은 ndarray가 특정 데이터를 메모리에서 해석하기 위해 필요한 정보를 담고 있는 특수한 객체
arr1 = np.array([1,2,3], dtype=np.float64)
print arr1
print arr1.dtype
[ 1. 2. 3.] float64
arr2 = np.array([1,2,3], dtype=np.int32)
print arr2
print arr2.dtype
[1 2 3] int32
# astype 메서드로 배열의 dtype을 다른 형으로 명시적 변경 가능.
arr = np.array([1, 2, 3, 4, 5])
print arr.dtype
float_arr = arr.astype(np.float64)
print float_arr.dtype
int64 float64
# 숫자 형식의 문자열도 astype으로 숫자로 변경가능.
numeric_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
print numeric_strings
numbers = numeric_strings.astype(float)
print numbers
['1.25' '-9.6' '42'] [ 1.25 -9.6 42. ]
arr = np.array([[1., 2., 3.],
[4., 5., 6.]])
arr
array([[ 1., 2., 3.], [ 4., 5., 6.]])
# 더하기
arr + arr
array([[ 2., 4., 6.], [ 8., 10., 12.]])
# 빼기
arr - arr
array([[ 0., 0., 0.], [ 0., 0., 0.]])
# 곱하기 (개별 원소 곱)
arr * arr
array([[ 1., 4., 9.], [ 16., 25., 36.]])
# 스칼라에 대한 산술 연산은 각 요소로 전달
1 / arr
array([[ 1. , 0.5 , 0.33333333], [ 0.25 , 0.2 , 0.16666667]])
arr * 0.5
array([[ 0.5, 1. , 1.5], [ 2. , 2.5, 3. ]])
arr ** 0.5
array([[ 1. , 1.41421356, 1.73205081], [ 2. , 2.23606798, 2.44948974]])
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
arr[5]
5
arr[5:8]
array([5, 6, 7])
# 브로드캐스팅. 배열 슬라이스에 스칼라 값을 대입하면, 그 범위에 값이 전파된다.
arr[5:8] = 12
arr
array([ 0, 1, 2, 3, 4, 12, 12, 12, 8, 9])
# 배열 슬라이스는 값을 복사하는게 아니다. 그러므로 배열 슬라이스의 값을 바꿔도 원본에 반영된다.
arr_slice = arr[5:8] # arr_slice로 arr[5:8]의 값이 복사된게 아님. view의 역할을 할뿐.
print arr
arr_slice[1] = 12345
print arr
arr_slice[:] = 64
print arr
[ 0 1 2 3 4 12 12 12 8 9] [ 0 1 2 3 4 12 12345 12 8 9] [ 0 1 2 3 4 64 64 64 8 9]
# 뷰 대신에 슬라이스의 복사본을 얻고 싶다면.
arr_slice_copy = arr[5:8].copy()
print arr_slice_copy
print arr
arr_slice_copy[:] = 8
print arr_slice_copy
print arr
[64 64 64] [ 0 1 2 3 4 64 64 64 8 9] [8 8 8] [ 0 1 2 3 4 64 64 64 8 9]
# 2차원 배열
arr2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
arr2d
array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
0,0 | 0,1 | 0,2 |
---|---|---|
1,0 | 1,1 | 1,2 |
2,0 | 2,1 | 2,2 |
# 특정 행에 접근
arr2d[2]
array([7, 8, 9])
# 특정 원소에 접근
arr2d[0][2]
3
# 위의 것은 다음과 같이 쓸 수 있다.
arr2d[0,2]
3
# 특정 열 추출
arr2d[:,0]
array([1, 4, 7])
arr2d[:][2]
array([7, 8, 9])
# 3차원 배열
arr3d = np.array([
[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[10, 11, 12]]
])
arr3d
array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]])
0 | ||
---|---|---|
0,0 | 0,1 | 0,2 |
1,0 | 1,1 | 1,2 |
1 | ||
0,0 | 0,1 | 0,2 |
1,0 | 1,1 | 1,2 |
arr3d[0]
array([[1, 2, 3], [4, 5, 6]])
arr3d[1]
array([[ 7, 8, 9], [10, 11, 12]])
arr3d[0][1]
array([4, 5, 6])
arr3d[0, 1]
array([4, 5, 6])
arr3d[1][1][2]
12
arr3d[1, 1, 2]
12
arr3d[:, 1, 2]
array([ 6, 12])
arr3d
array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]])
arr3d[0]
array([[1, 2, 3], [4, 5, 6]])
old_values = arr3d[0].copy() # 원래의 값을 보존하기 위해 복사.
arr3d[0] = 42 # 슬라이스에 스칼라 대입
arr3d
array([[[42, 42, 42], [42, 42, 42]], [[ 7, 8, 9], [10, 11, 12]]])
arr3d[0] = old_values # 슬라이스에 배열 대입 가능(차원이 맞아야 함)
arr3d
array([[[ 1, 2, 3], [ 4, 5, 6]], [[ 7, 8, 9], [10, 11, 12]]])
arr3d[0] = np.array([1,2])
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-66-3afd55bb0abd> in <module>() ----> 1 arr3d[0] = np.array([1,2]) ValueError: could not broadcast input array from shape (2) into shape (2,3)
arr = np.arange(15)
arr
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
arr = arr.reshape((3, 5))
arr
array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9], [10, 11, 12, 13, 14]])
# 전치(transpose)
arr.T
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
arr.transpose()
array([[ 0, 5, 10], [ 1, 6, 11], [ 2, 7, 12], [ 3, 8, 13], [ 4, 9, 14]])
# 행렬 내적
arr = np.random.randn(6,3)
arr
array([[-0.2076657 , -1.12094658, 0.61984314], [ 0.94419704, -0.64767335, 0.8012834 ], [ 0.53443576, -0.26279777, -1.34619569], [-0.19775452, -0.8455633 , -0.3602344 ], [-0.8157946 , 0.33324178, -0.18393122], [-1.38288628, -0.6405826 , -0.85682243]])
np.dot(arr.T, arr)
array([[ 3.83725683, 0.26201237, 1.31457021], [ 0.26201237, 2.98143811, -0.06783077], [ 1.31457021, -0.06783077, 3.73624765]])
arr = np.arange(10)
arr
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
# 단항 유니버설 함수
np.sqrt(arr)
array([ 0. , 1. , 1.41421356, 1.73205081, 2. , 2.23606798, 2.44948974, 2.64575131, 2.82842712, 3. ])
np.exp(arr)
array([ 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 = randn(8)
print x
y = randn(8)
print y
np.maximum(x, y) # element-wise maximum
[ 0.0967883 -1.67521403 1.64327249 1.95540243 0.58640696 -0.54404345 0.51192415 0.59918442] [ 0.55136643 -1.62589557 -0.75345847 -0.38791841 -1.22037736 -1.11515184 0.55690104 0.11316851]
array([ 0.55136643, -1.62589557, 1.64327249, 1.95540243, 0.58640696, -0.54404345, 0.55690104, 0.59918442])
# 배열연산 조건절 표현하기
arr = np.random.randn(4, 4)
arr
array([[-0.80226147, 1.67485488, 0.13617279, 1.33824164], [-0.76138352, 0.18015578, -0.79917102, 0.69047915], [-0.23689069, 1.62039386, -0.56544592, 0.18518925], [-0.50333841, -0.2041948 , -0.35954173, 1.87880381]])
np.where( arr > 0, 2, -2) # 양수는 모두 2로, 음수는 모두 -1로 변경
array([[ 2, 2, -2, -2], [ 2, 2, 2, 2], [-2, -2, 2, -2], [-2, -2, -2, 2]])
np.where( arr > 0, 2, arr) # 양수는 2로, 음수는 원래 값 그대로
array([[ 2. , 2. , -1.81220706, -0.05290094], [ 2. , 2. , 2. , 2. ], [-0.08778373, -1.31906435, 2. , -0.18864948], [-1.01932823, -0.69414154, -1.32050374, 2. ]])
# randn (normally-distributed data)
arr = np.random.randn(5, 4)
arr
array([[-0.18872156, -0.00937502, 1.02528247, -0.2336773 ], [ 0.13697903, 0.40498426, -0.02145654, -0.53837257], [ 0.02580721, 0.22526115, -0.76233053, 0.26992687], [ 0.07412079, 1.57429726, -0.19075057, 0.38820259], [-0.10767344, -1.7242222 , 0.716758 , -1.5607776 ]])
arr.mean()
-0.024786884534673759
np.mean(arr)
-0.024786884534673759
arr.sum()
-0.49573769069347517
# mean이나 sum같은 함수는 axis 인자를 받아, 해당 axis에 대한 통계를 계산하고 한 차수 낮은 배열을 반환한다.
arr.mean(axis=1)
array([ 0.14837715, -0.00446646, -0.06033383, 0.46146752, -0.66897881])
arr.sum(0)
array([-0.05948797, 0.47094545, 0.76750284, -1.67469801])
# cumsum과 cumprod 메서드는 중간 계산 값을 담고 있는 배열을 반환한다.
arr = np.array([
[0, 1, 2],
[3, 4, 5],
[6, 7, 8]
])
arr
array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr.cumsum()
array([ 0, 1, 3, 6, 10, 15, 21, 28, 36])
arr.cumsum(0)
array([[ 0, 1, 2], [ 3, 5, 7], [ 9, 12, 15]])
arr.cumprod(1)
array([[ 0, 0, 0], [ 3, 12, 60], [ 6, 42, 336]])
arr = np.random.randn(8)
arr
array([-0.74932004, 0.81202617, -0.94114978, 0.66775995, -0.21599847, -0.53131814, 1.18755295, -0.17303755])
arr.sort()
arr
array([-0.94114978, -0.74932004, -0.53131814, -0.21599847, -0.17303755, 0.66775995, 0.81202617, 1.18755295])
arr = randn(5, 3)
arr
array([[-1.15729656, 0.53208771, 0.82451164], [ 1.00494958, -0.37859057, 0.64012556], [ 0.83376375, -1.45444792, -1.3117023 ], [-0.96079299, 1.48396206, -0.76299037], [-0.11370724, -0.56658628, 0.40526753]])
arr.sort(1)
arr
array([[-1.15729656, 0.53208771, 0.82451164], [-0.37859057, 0.64012556, 1.00494958], [-1.45444792, -1.3117023 , 0.83376375], [-0.96079299, -0.76299037, 1.48396206], [-0.56658628, -0.11370724, 0.40526753]])
large_arr = randn(1000)
large_arr.sort()
large_arr[int(0.05 * len(large_arr))]
-1.662950929232514
# 중복 제거
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
print names
print np.unique(names)
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe'] ['Bob' 'Joe' 'Will']
# 2개의 배열을 인자로 받아 첫 번째 배열의 각 원소가 두 번째 배열의 원소를 포함하는지를 나타내는 불리언 배열을 반환
values = np.array([6, 0, 0, 3, 2, 5, 6])
print values
print [2, 3, 6]
print np.in1d(values, [2, 3, 6])
[6 0 0 3 2 5 6] [2, 3, 6] [ True False False True True False True]
arr = np.arange(8)
arr
array([0, 1, 2, 3, 4, 5, 6, 7])
arr.reshape((4,2))
array([[0, 1], [2, 3], [4, 5], [6, 7]])
# 다차원 재형성도 가능
arr.reshape((4,2)).reshape((2,4))
array([[0, 1, 2, 3], [4, 5, 6, 7]])
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr1
array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
arr2
array([[ 7, 8, 9], [10, 11, 12]])
# axis에 맞춰 합친다 0=로우 우선, 1=컬럼 우선
np.concatenate([arr1, arr2], axis=0)
array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])
np.concatenate([arr1, arr2], axis=1)
array([[ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12]])
np.hstack((arr1, arr2))
array([[ 1, 2, 3, 7, 8, 9], [ 4, 5, 6, 10, 11, 12]])
np.vstack((arr1, arr2))
array([[ 1, 2, 3], [ 4, 5, 6], [ 7, 8, 9], [10, 11, 12]])
# 배열과 스칼라 값 연산의 경우
import numpy as np
arr = np.arange(5)
arr
array([0, 1, 2, 3, 4])
# 4의 곱 브로드캐스팅
arr + 4
array([4, 5, 6, 7, 8])
# 배열의 각 칼럼에서 칼럼의 평균 값을 빼기
arr = randn(4,3)
arr
array([[ 0.41949176, -0.40404443, -0.40992978], [-0.31286111, 1.24607613, 0.98488495], [ 0.32951646, 0.04936468, 1.65439179], [ 0.5054299 , 1.63305808, 0.56269416]])
arr.mean(0)
array([ 0.23539425, 0.63111361, 0.69801028])
demeaned = arr - arr.mean(0)
demeaned
array([[ 0.1840975 , -1.03515804, -1.10794006], [-0.54825536, 0.61496251, 0.28687467], [ 0.09412221, -0.58174894, 0.95638151], [ 0.27003565, 1.00194446, -0.13531612]])
# 칼럼이 아니라 각 로우에서 평균 값 빼기
arr
array([[ 0.41949176, -0.40404443, -0.40992978], [-0.31286111, 1.24607613, 0.98488495], [ 0.32951646, 0.04936468, 1.65439179], [ 0.5054299 , 1.63305808, 0.56269416]])
row_means = arr.mean(1)
row_means
array([-0.13149415, 0.63936665, 0.67775764, 0.90039404])
# 4 x 3 자료형에서 1x4 배열을 빼므로 차원이 맞지 않다.
arr - row_means
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) <ipython-input-201-3d1314c7e700> in <module>() ----> 1 arr - row_means ValueError: operands could not be broadcast together with shapes (4,3) (4,)
# 4 X 1 로 바꿔준다.
row_means.reshape((4,1))
array([[-0.13149415], [ 0.63936665], [ 0.67775764], [ 0.90039404]])
arr - row_means.reshape((4,1))
array([[ 0.55098591, -0.27255028, -0.27843563], [-0.95222776, 0.60670947, 0.34551829], [-0.34824118, -0.62839297, 0.97663415], [-0.39496415, 0.73266403, -0.33769989]])
# 행렬 덧셈, 뺄셈
A = np.array([[1,2,3],
[4,5,6],
[7,8,9]])
print A
B = np.array([[1,1,1],
[1,1,1],
[1,1,1]])
print B
print A + B
--------------------------------------------------------------------------- NameError Traceback (most recent call last) <ipython-input-1-85699b83f3a4> in <module>() 1 # 행렬 덧셈, 뺄셈 ----> 2 A = np.array([[1,2,3], 3 [4,5,6], 4 [7,8,9]]) 5 print A NameError: name 'np' is not defined
print A - B
[[0 1 2] [3 4 5] [6 7 8]]
# 행렬 곱
print A
# 스칼라 곱
print A*2
[[1 2 3] [4 5 6] [7 8 9]] [[ 2 4 6] [ 8 10 12] [14 16 18]]
print A
C = np.array([[2],[2],[2]])
print C
# 행렬곱
print np.dot(A,C)
[[1 2 3] [4 5 6] [7 8 9]] [[2] [2] [2]] [[12] [30] [48]]
from pandas import Series
import pandas as pd
obj = Series([4, 7, -5, 3])
# 결과의 왼쪽이 색인(index), 오른쪽이 값
obj
0 4 1 7 2 -5 3 3 dtype: int64
obj.values
array([ 4, 7, -5, 3])
obj.index
Int64Index([0, 1, 2, 3], dtype='int64')
# 색인을 지정해서 생성할 수 있다.
obj2 = Series([4, 7, -5, 3], index=['d', 'b', 'a', 'c'])
obj2
d 4 b 7 a -5 c 3 dtype: int64
obj2.index
Index([u'd', u'b', u'a', u'c'], dtype='object')
obj2[0]
4
# 색인을 이용해 접근
obj2['a']
-5
obj2['d'] = 6
obj2
d 6 b 7 a -5 c 3 dtype: int64
obj2[['c', 'a', 'd']]
c 3 a -5 d 6 dtype: int64
obj2[obj2 > 0]
d 6 b 7 c 3 dtype: int64
obj2 * 2
d 12 b 14 a -10 c 6 dtype: int64
np.exp(obj2)
d 403.428793 b 1096.633158 a 0.006738 c 20.085537 dtype: float64
# 사전형 객체로부터 생성
sdata = {'Ohio': 35000,
'Texas': 71000,
'Oregon': 16000,
'Utah': 5000}
sdata
{'Ohio': 35000, 'Oregon': 16000, 'Texas': 71000, 'Utah': 5000}
obj3 = Series(sdata)
obj3
Ohio 35000 Oregon 16000 Texas 71000 Utah 5000 dtype: int64
# 사전으로 형성된 객체에, 새 인덱스가 추가되면 값이 NaN으로 매핑된다.
states = ['California', 'Ohio', 'Oregon', 'Texas']
obj4 = Series(sdata, index=states)
obj4
California NaN Ohio 35000 Oregon 16000 Texas 71000 dtype: float64
# 누락값을 찾기 위해서 pandas의 함수를 사용한다.
# isnull
pd.isnull(obj4)
California True Ohio False Oregon False Texas False dtype: bool
# notnull
pd.notnull(obj4)
California False Ohio True Oregon True Texas True dtype: bool
# Series의 메서드에도 있음.
obj4.isnull()
California True Ohio False Oregon False Texas False dtype: bool
obj4.notnull()
California False Ohio True Oregon True Texas True dtype: bool
# index 멤버객체에 리스트로 인덱스를 대입하면 인덱스 변경가능
obj
Bob 4 Steve 7 Jeff -5 Ryan 3 dtype: int64
obj.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
obj
Bob 4 Steve 7 Jeff -5 Ryan 3 dtype: int64
from pandas import DataFrame
# Series 객체를 담고 있는 사전으로 생성
data = {'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
'year': [2000, 2001, 2002, 2001, 2002],
'pop': [1.5, 1.7, 3.6, 2.4, 2.9]}
frame = DataFrame(data)
frame
pop | state | year | |
---|---|---|---|
0 | 1.5 | Ohio | 2000 |
1 | 1.7 | Ohio | 2001 |
2 | 3.6 | Ohio | 2002 |
3 | 2.4 | Nevada | 2001 |
4 | 2.9 | Nevada | 2002 |
# 순서를 정해서 생성
DataFrame(data, columns=['year', 'state', 'pop'])
year | state | pop | |
---|---|---|---|
0 | 2000 | Ohio | 1.5 |
1 | 2001 | Ohio | 1.7 |
2 | 2002 | Ohio | 3.6 |
3 | 2001 | Nevada | 2.4 |
4 | 2002 | Nevada | 2.9 |
# 로우 인덱스도 함께 생성
frame2 = DataFrame(data, columns=['year', 'state', 'pop', 'debt'],
index=['one', 'two', 'three', 'four', 'five'])
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | NaN |
two | 2001 | Ohio | 1.7 | NaN |
three | 2002 | Ohio | 3.6 | NaN |
four | 2001 | Nevada | 2.4 | NaN |
five | 2002 | Nevada | 2.9 | NaN |
frame2.columns
Index([u'year', u'state', u'pop', u'debt'], dtype='object')
# 컬럼 접근 방법
# 사전 형식 표기법
frame2['state']
one Ohio two Ohio three Ohio four Nevada five Nevada Name: state, dtype: object
#속성 형식으로
frame2.state
one Ohio two Ohio three Ohio four Nevada five Nevada Name: state, dtype: object
# 로우 접근 방법
frame2.ix['three']
year 2002 state Ohio pop 3.6 debt NaN Name: three, dtype: object
# 값 넣기
frame2['debt'] = 16.5
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 16.5 |
two | 2001 | Ohio | 1.7 | 16.5 |
three | 2002 | Ohio | 3.6 | 16.5 |
four | 2001 | Nevada | 2.4 | 16.5 |
five | 2002 | Nevada | 2.9 | 16.5 |
# 배열도 대입가능
frame2['debt'] = np.arange(5.)
frame2
year | state | pop | debt | |
---|---|---|---|---|
one | 2000 | Ohio | 1.5 | 0 |
two | 2001 | Ohio | 1.7 | 1 |
three | 2002 | Ohio | 3.6 | 2 |
four | 2001 | Nevada | 2.4 | 3 |
five | 2002 | Nevada | 2.9 | 4 |
# 로우, 컬럼 변경
pop = {'Nevada': {2001: 2.4,
2002: 2.9},
'Ohio': {2000: 1.5,
2001: 1.7,
2002: 3.6}}
frame3 = DataFrame(pop)
frame3
Nevada | Ohio | |
---|---|---|
2000 | NaN | 1.5 |
2001 | 2.4 | 1.7 |
2002 | 2.9 | 3.6 |
frame3.T
2000 | 2001 | 2002 | |
---|---|---|---|
Nevada | NaN | 2.4 | 2.9 |
Ohio | 1.5 | 1.7 | 3.6 |
obj = Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
obj
a 0 b 1 c 2 d 3 e 4 dtype: float64
new_obj = obj.drop('c')
new_obj
a 0 b 1 d 3 e 4 dtype: float64
obj.drop(['d', 'c'])
a 0 b 1 e 4 dtype: float64
data = DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
data
one | two | three | four | |
---|---|---|---|---|
Ohio | 0 | 1 | 2 | 3 |
Colorado | 4 | 5 | 6 | 7 |
Utah | 8 | 9 | 10 | 11 |
New York | 12 | 13 | 14 | 15 |
# 로우 삭제
data.drop(['Colorado', 'Ohio'])
one | two | three | four | |
---|---|---|---|---|
Utah | 8 | 9 | 10 | 11 |
New York | 12 | 13 | 14 | 15 |
# 컬럼 삭제
data.drop(['two', 'four'], axis=1)
one | three | |
---|---|---|
Ohio | 0 | 2 |
Colorado | 4 | 6 |
Utah | 8 | 10 |
New York | 12 | 14 |
obj = Series(np.arange(4.), index=['a', 'b', 'c', 'd'])
obj
a 0 b 1 c 2 d 3 dtype: float64
obj['b']
1.0
obj[1]
1.0
obj[2:4]
c 2 d 3 dtype: float64
obj[['b', 'a', 'd']]
b 1 a 0 d 3 dtype: float64
obj[obj < 2]
a 0 b 1 dtype: float64
# 라벨 이름으로 슬라이싱하는 것은 시작점과 끝점을 포함한다는 점이 일반 파이썬에서의 슬라이싱과 다른 점
obj['b':'c']
b 1 c 2 dtype: float64
data = DataFrame(np.arange(16).reshape((4, 4)),
index=['Ohio', 'Colorado', 'Utah', 'New York'],
columns=['one', 'two', 'three', 'four'])
data
one | two | three | four | |
---|---|---|---|---|
Ohio | 0 | 1 | 2 | 3 |
Colorado | 4 | 5 | 6 | 7 |
Utah | 8 | 9 | 10 | 11 |
New York | 12 | 13 | 14 | 15 |
# 컬럼 선택
data['two']
Ohio 1 Colorado 5 Utah 9 New York 13 Name: two, dtype: int64
data[['three', 'one']]
three | one | |
---|---|---|
Ohio | 2 | 0 |
Colorado | 6 | 4 |
Utah | 10 | 8 |
New York | 14 | 12 |
# 로우 선택
data[:2]
one | two | three | four | |
---|---|---|---|---|
Ohio | 0 | 1 | 2 | 3 |
Colorado | 4 | 5 | 6 | 7 |
data.ix['Colorado']
one 4 two 5 three 6 four 7 Name: Colorado, dtype: int64
data.ix['Colorado', ['two', 'three']]
two 5 three 6 Name: Colorado, dtype: int64
data.ix[['Colorado', 'Utah']]
one | two | three | four | |
---|---|---|---|---|
Colorado | 4 | 5 | 6 | 7 |
Utah | 8 | 9 | 10 | 11 |
data.ix[['Colorado', 'Utah'], ['two', 'three']]
two | three | |
---|---|---|
Colorado | 5 | 6 |
Utah | 9 | 10 |