Updated:

import numpy as np

4.1. Vector Indexing, Slicing, Assignment

Python list를 접근하듯이 똑같이 ndarray에 접근할 수 있다.

Vector Indexing

  • ndarray[-1]: 마지막 원소 접근
  • ndarray[-n]: 뒤에서 n번째 원소 접근

Vector Slicing

  • ndarray[start:]: 뒷부분이 생략되면 ‘마지막 원소까지’ 라는 의미 / ndarray[start]부터 마지막 원소까지 추출
  • ndarray[:end]: 앞부분이 생략되면 ‘처음부터’ 라는 의미 / 처음부터 ndarray[end-1] 원소까지 추출
  • ndarray[start:end]: ndarray[start] 부터 ndarray[end-1] 까지 원소가 추출된다.
  • ndarray[start:end:step] : ndarray[start:end] 원소 중 step간격의 원소가 추출된다. (ndarray[start], ndarray[start+step], …) (단, step이 음수라면 start에서부터 거꾸로 출력되므로 start가 end보다 커야한다. 주의 필요!)
a = np.arange(10)
print("a[-1]:",a[-1],"a[-2]:",a[-2])

# 처음부터 마지막 원소전까지 출력
print("a[:-1]:",a[:-1])

# 뒤에서 5번째 원소부터 출력
print("a[-5:]:",a[-5:])

# 짝수번째 인덱스 원소들 출력
print("a[::2]:",a[::2])

# 홀수번째 인덱스 원소를 출력
print("a[1::2]:",a[1::2])

# 세번째 인덱스 원소부터 마지막 원소전까지 2간격마다의 원소들을 출력
print("a[3:-1:2]:",a[3:-1:2])
a[-1]: 9 a[-2]: 8
a[:-1]: [0 1 2 3 4 5 6 7 8]
a[-5:]: [5 6 7 8 9]
a[::2]: [0 2 4 6 8]
a[1::2]: [1 3 5 7 9]
a[3:-1:2]: [3 5 7]

Assignment with Vector Slicing

  • ndarray[start:end:step] = a : ndarray[start:end:step]이 모두 a로 바뀐다. (step 생략하고 사용가능)
  • ndarray[start:end:step] = otherArray : ndarray[step:end:step]과 otherArray의 shape이 일치하면 otherArray로 바뀐다. (step 생략하고 사용가능)
a = np.arange(12)
print("a:",a)

a[::2] = 100
print("a:",a,'\n')

b = np.arange(12)
print("b:",b)

b[:-3:2] = np.arange(11,23)[:-3:2]
print("b:",b)
a: [ 0  1  2  3  4  5  6  7  8  9 10 11]
a: [100   1 100   3 100   5 100   7 100   9 100  11]

b: [ 0  1  2  3  4  5  6  7  8  9 10 11]
b: [11  1 13  3 15  5 17  7 19  9 10 11]

4.2. Matrix Indexing, Slicing

Matrix Indexing, Slicing

Python List에서는 M[a][b]와 같이 대괄호 2개를 이용하여 접근이 가능했지만 ndarray는 M[a,b]와 같이 ‘,’로 구분하여 접근한다.

전체를 뜻하는 ‘:’는 ‘…‘로 바꿔서 사용이 가능하다.

나머지 Indexing, Slicing 방법은 Vector Indexing, Slicing 사용하듯이 Matrix Indexing, Slicing하여 사용가능하다.

a = np.arange(2*3).reshape((2,3))
print("a:\n",a)
print("a[1,2]:",a[1,2],'\n')

# 첫번째열 출력
print("a[:,0]:",a[:,0])
print("a[...,0]:",a[...,0],'\n')

# 각 행의 두번째 3번째 원소 출력
print("a[:,1:]",a[:,1:])
a:
 [[0 1 2]
 [3 4 5]]
a[1,2]: 5

a[:,0]: [0 3]
a[...,0]: [0 3]

a[:,1:] [[1 2]
 [4 5]]
a = np.arange(4*4).reshape((4,4))
print("a:\n",a)

# 수평선 뒤집기
b = a[::-1,:]
print("b:\n",b)

# 수직선 뒤집기
c = a[:,::-1]
print("c:\n",c)
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
b:
 [[12 13 14 15]
 [ 8  9 10 11]
 [ 4  5  6  7]
 [ 0  1  2  3]]
c:
 [[ 3  2  1  0]
 [ 7  6  5  4]
 [11 10  9  8]
 [15 14 13 12]]

4.3. 3차원 이상 ndarray Indexing, Slicing

2차원 ndarray인 Matrix를 indexing, slicing 하는 것과 동일한 방법으로 3차원 이상의 ndarray에 접근가능하다.

a = np.arange(2*3*3).reshape((2,3,3))
print("a:\n",a,'\n')

print("a[:,:-1,:]:\n",a[:,:-1,:])
a:
 [[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]]

 [[ 9 10 11]
  [12 13 14]
  [15 16 17]]]

a[:,:-1,:]:
 [[[ 0  1  2]
  [ 3  4  5]]

 [[ 9 10 11]
  [12 13 14]]]

4.4. int ndarray, boolean ndarray를 이용한 Indexing

indices: int ndarray라고 가정

  • a[indices]: shape - indices / 원소 - indices의 원소에 해당하는 index를 가진 a의 원소로 구성됨
  • a (>,%,!=,==, bool값을 반환하는 연산자) 0 : ndarray 각 원소를 연산자로 판별하여 맞으면 True, 아니면 False로 구성된 bool ndarray가 반환됨
  • a[a>=0]: ndarray의 원소중 0이상인 것만 추출됨
a = np.random.randint(-6,6,(6,))
indices = np.array([0,2,4])
print("a:\n",a,'\n')

print("indices:",indices)
print("a[indices]:",a[indices])
print("a>=0:",a>=0)
print("a[a>=0]:",a[a>=0])
a:
 [-4 -2 -6  2 -6  2]

indices: [0 2 4]
a[indices]: [-4 -6 -6]
a>=0: [False False False  True False  True]
a[a>=0]: [2 2]
a = np.random.randint(0,10,(6,))
indices = np.random.randint(0,6,(2,3))

print("a:",a)
print("indices:\n",indices)
print("a[indices]:\n",a[indices])
a: [8 4 9 9 7 1]
indices:
 [[2 3 1]
 [5 2 2]]
a[indices]:
 [[9 9 4]
 [1 9 9]]

indices1, indices2: int ndarray로 가정

  • a[indices1,indices2]: shape - indices / 원소 - a[indices1의 첫번째원소, indices2의 첫번째 원소], a[indices1의 두번째 원소, indices2의 세번째 원소], a[indices1의 n번째 원소, indices2의 n번째 원소]로 구성된 ndarray를 반환함.
a = np.arange(3*4).reshape((3,4))
indices1 = np.random.randint(0,3,(2,3))
indices2 = np.random.randint(0,4,(2,3))

print("a:\n",a,'\n')

print("indices1:\n",indices1)
print("indices2:\n",indices2,'\n')

print("a[indices1, indices2]:\n",a[indices1,indices2])
a:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

indices1:
 [[1 0 0]
 [1 2 0]]
indices2:
 [[3 1 2]
 [0 0 2]]

a[indices1, indices2]:
 [[7 1 2]
 [4 8 2]]
  • np.nonzero(a) : a 원소 중에서 0이 아닌 원소의 index를 가진 ndarray를 반환한다.
  • np.where(condition,[x,y]): condition이 True이면 x를, False이면 y를 가진 ndarray를 반환한다. x,y 생략시 해당 조건문에 True인 index가 반환된다.
a = np.random.randint(-3,4,(6,))
print("a:",a)
print("nonzero:",np.nonzero(a),'\n')

b = np.random.randint(0,6,(6,))
print("b:",b)
print("where(condition,x,y):",np.where(b%2==0,b,-1))
print("where(condition):",np.where(b%2==0))
a: [-2  2 -2  2  1  3]
nonzero: (array([0, 1, 2, 3, 4, 5]),)

b: [0 3 0 4 3 4]
where(condition,x,y): [ 0 -1  0  4 -1  4]
where(condition): (array([0, 2, 3, 5]),)

Leave a comment