본문 바로가기
파이썬/Numpy(넘파이)

[NumPy] 3. 넘파이 인덱싱, 슬라이싱, 반복(indexing, slicing, iterating)

by 쿠킷리스트 2021. 10. 12.

학습내용

#1 : 넘파이 인덱싱(indexing), 슬라이싱(slicing), 반복(iterating)
      1) 1차원 배열
      2) 다차원 배열의 인덱싱, 슬라이싱
      3) ... 의 사용
      4) 다차원 배열의 반복

#1 : 넘파이 인덱싱(indexing), 슬라이싱(slicing), 반복(iterating)

1) 1차원 배열

 1차원 배열은 리스트나 다른 python sequence처럼 인덱싱, 슬라싱, 반복을 사용할 수 있다.

a = np.arange(10)**3
a
# array([  0,   1,   8,  27,  64, 125, 216, 343, 512, 729])
a[2]
#8
a[2:5]
#array([ 8, 27, 64])
a[::-1]
#array([729, 512, 343, 216, 125,  64,  27,   8,   1,   0])
a[:6:2] = 1000
a
#array([1000,    1, 1000,   27, 1000,  125,  216,  343,  512,  729])

for i in a:
    print(i**(1/3.))
# 9.999999999999998
# 1.0
# 9.999999999999998
# 3.0
# 9.999999999999998
# 4.999999999999999
# 5.999999999999999
# 6.999999999999999
# 7.999999999999999
# 8.999999999999998

2) 다차원 배열의 인덱싱, 슬라이싱

 다차원 배열에서는 축당 하나의 인덱스를 가질 수 있다. 이 인덱스들은,(commas)로 분리된 튜플에서 제공된다. 배열의 인덱스로 음수를 사요할 수 있다.

 

def f(x,y):
    return 10*x+y
b = np.fromfunction(f,(5,4),dtype=int)
b
# array([[ 0,  1,  2,  3],
#        [10, 11, 12, 13],
#        [20, 21, 22, 23],
#        [30, 31, 32, 33],
#        [40, 41, 42, 43]])

b[2,3] #변수 b의 3번째 행의 4번째 열 값
#23
b[0:5,1] #변수 b의 각 행의 2번째 열 값
# array([ 1, 11, 21, 31, 41])
b[:,1] # 변수 b의 전체 행의 2번째 열 값
# array([ 1, 11, 21, 31, 41])
b[1:3,:] #변수 b의 1, 2행의 전체 열 값
# array([[10, 11, 12, 13],
#        [20, 21, 22, 23]])
b[-1] #변수 b의 마지막 행 값
# array([40, 41, 42, 43])
b[-2] #변수 b의 마지막-1 행 값
# array([30, 31, 32, 33])

3) ... 의 사용

 ... 은 차원이 너무 많을 때 실수를 줄여줄 수 있다. 만약 x가 5차원이라고 할 때 아래와 같이 표현할 수 있다.

  • x[1, 2, ...] 은 x[1, 2, : , : , :]와 같다.
  • x[ ... , 3]은 x[ : , : , : , : , 3]와 같다.
  • x[4, ... , 5, :]은 x[4, : , : , 5 , :]와 같다.
c = np.array([[[0, 1, 2],
[10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
c.shape # 3차원 배열(2차원 두개로 이루어진)
#(2, 2, 3)

 위 코드를 살펴보면 c.shape은 (2, 2, 3) 형태인데 이는 1차원 2개가 2차원을 구성하고, 그 2차원 2개가 3차원을 구성한다는 의미이다. 즉, 1차원 [0,1,2] [10,12,13] 2차원 하나 [[0,1,2],[10,12,13]]를 이루고 또 다른 1차원 [100,101,102] [110,112,113] 2차원 하나 [[100,101,102],[110,112,113]]를 이룬다. 2차원인 [[0,1,2],[10,12,13]] [[100,101,102],[110,112,113]] 3차원 하나를 [[[0,1,2],[10,12,13]],[[100,101,102],[110,112,113]]] 이룬다.

3차원 [[[0,1,2],[10,12,13]],[[100,101,102],[110,112,113]]]
2차원 [[0,1,2],[10,12,13]] [[100,101,102],[110,112,113]]
1차원 [0,1,2] [10,12,13] [100,101,102] [110,112,113]
c = np.array([[[0, 1, 2],
[10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
c.shape # 3차원 배열(2차원 두개로 이루어진)
#(2, 2, 3)

c[1, ...] # c[1, :, :], c[1]과 똑같다.
# array([[100, 101, 102],
#        [110, 112, 113]])

c[..., 2] # c[:,:,2]와 똑같다.
array([[  2,  13],
       [102, 113]])

- c[1, ...]은 두번째 2차원 배열을 의미한다.

- c[... , 2]는 2차원 테이블 전체의, 전체 행의, 3번 째 값을 의미한다. 결과는 2차원이 나온다.

- 3차원에서 하나를 끄집어 낸다는 것은 2차원이 된다는 것, 2차원에서 하나를 끄집어 낸다는 것은 1차원이 된다는 것.


4) 다차원 배열의 반복

 다차원 배열을 for문을 적용하면 axis = 0 기준으로 적용된다. 만약 배열의 모든 원소를 for문을 적용하고 싶을 경우 .reshape()을 사용해도 되지만, .flat을 사용할 수도 있다.

def f(x,y):
    return 10*x+y
b = np.fromfunction(f,(5,4),dtype=int)

for row in b:
    print(row)
# [0 1 2 3]
# [10 11 12 13]
# [20 21 22 23]
# [30 31 32 33]
# [40 41 42 43]

- 2차원일 때 for문을 적용해 출력하면 1차원 배열이 나온다.

for element in b.flat:
    print(element)
# 0
# 1
# 2
# 3
# 10
# 11
# 12
# 13
# 20
# 21
# 22
# 23
# 30
# 31
# 32
# 33
# 40
# 41
# 42
# 43

댓글