넘파이(mumpy)기초 2
배열에서 특정 범위의 데이터 골라내기
넘파이 배열안의 값에 접근하는 방법은 목록안의 값에 접근하는 방법과 거의 같지만 약간의 차이가 있습니다.
먼저 목록의 경우를 보겠습니다. 먼저 2차원 목록을 만들어 보겠습니다.
A = [[10*n+m for m in range(10)] for n in range(5)] print(A)
[[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]]
보기 좋게 2차원 목록의 내용을 출력하면 다음과 갔습니다.
$$ \textbf A = \left[
\begin{array}{cccccccccccㅊcc}
[&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&] \\
\end{array}
\right ] $$
3번째 행(위에서 아래로 세번째 가로줄)의 4번째 열(왼쪽에서 오른쪽으로 네번째 세로줄)의 값을 보려면 A[2][3]라고 입력해야합니다. 23이 나옵니다. 첫번째 대괄호안에는 위에서 몇번쨰 행인지를 나타내는 숫자를, 두번째 대괄호안에는 왼쪽에서 몇번쨰 열인지를 나타내는 숫자를 씁니다. 첫번째는 0, 두번째는 1 과 같은 식으로 0에서 부터 순서는 시작됩니다.
print(A[2][3])
23
이제 2차원 넘파이 배열(numpy array)을 만들어보겠습니다. 먼저 numpy 모듈을 불러오고, np.array함수를 이용해서 위에서 만든 2차원 목록으로 부터 바로 2차원 배열을 만들겠습니다.
import numpy as np B = np.array(A) print(B)
[[ 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]]
넘파이 배열은 마치 목록처럼 써서 배열안의 값에 접근할 수있습니다.
B[2][3]
23
또 다른 접근방법이 있습니다. 대괄호는 하나만 쓰고 행과 열의 위치를 쉼표로 구분해서 넣어주는 방법입니다.
B[2,3]
23
그런데 이 방법을 목록에 적용하면 에러 메시지가 출력됩니다. 목록에는 사용할 수 없는 방법이란 얘기입니다.
A[2,3]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in ()
----> 1 A[2,3]
TypeError: list indices must be integers or slices, not tuple
위에서 만든 2차원 넘파이 배열 B에서, 어떤 이유로 첫번째 세로 두줄만 필요하다고 가정해 보겠습니다. 이 두줄만 복사g해 새로운 변수 B2에 저장하는 방법은 다음과 같습니다.
B2 = B[:,0:2] print(B2)
[[ 0 1]
[10 11]
[20 21]
[30 31]
[40 41]]
세로줄을 모두 선택하려면 B다음에 오는 대괄호안의 첫번쟤 칸에 숫자대신 :을 칩니다. 그런 다음 두번째 칸에는 복사할 세로줄의 범위를 0:2와 같은 방법으로 씁니다. :전에 쓰는 숫자는 첫번째 세로줄의 자리를 나타내는 숫자이고, :다음에 쓰는 숫자는 마지막 세로줄을 다음 숫자입니다. 파이썬에서 첫번째를 나타내는 숫자는 0임 기억하면, 0:2는 첫째 세로줄(0)에서 두번쨰 세로줄(1)을 골라내는 것을 의미합니다.
만약에 세번째 세로줄(2)에서 여덟번째 세로줄(7)을 골러낼려면 대괄호안 두번째 칸에 2:8이라고 적어줘야합니다. 이를 B3라는 변수에 저장하려면 다음과 같은 코드를 쓰면 됩니다.
B3 = B[:,2:8] print(B3)
[[ 2 3 4 5 6 7]
[12 13 14 15 16 17]
[22 23 24 25 26 27]
[32 33 34 35 36 37]
[42 43 44 45 46 47]]
가로줄을 골라내는 것도 비슷합니다. 대괄호안의 첫번째 칸에 가로줄 범위를 쓰고, 두번째 칸에는 :쓰면 됩니다. 예를 들어 B에 저장된 배열의 세번째 가로줄(3)과 다섯번째 가로줄(4)을 골라내려면 다음과 같은 코드를 쓰면 됩니다.
B4 = B[3:5,:] print(B4)
[[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]]
위의 경우는 맨마지막 가로줄까지 골라냅니다. 이런 경우는 :다음에 굳이 숫자를 안 써도 됩니다. 위의 경우에는 :다음에 5를 안써도 된다는 얘기입니다.
B4 = B[3:,:] print(B4)
[[30 31 32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47 48 49]]
실제 데이터를 다루다 보면 모든 데이터가 다 필요하지 않고 특정 범위의 데이터만 필요한 경우가 종종 있습니다. 이럴때는 위에서 설명한 것과 같이 넘파이를 써서 특정범위의 데이터를 쉽게 골라낼 수 있습니다.
2번째 가로줄(1)에서 4번째 가로줄(3)을 골라내는데 그중에서 세로줄은 세번째(2)에서 여섯번쨰(5)까지만 골라낼려면 배열을 저장한 변수뒤에 [1:4,2:5]라고 쓰면됩니다.
B5 = B[1:4,2:5] print(B5)
[[12 13 14]
[22 23 24]
[32 33 34]]
이렇게 넘파이에서 데이터를 골라내는 방법은 다음에 다를 팬더스(pandas) 모듈에서도 비슷하게 쓰입니다.