인덱싱, 정렬, 행렬 연산

코드싸개·2020년 12월 17일
1

인덱싱(indexing)

numpy ndarray의 인덱싱은 리스트와 유사합니다.

array1 = np.arange(start=1, stop=10)
print('array1:', array1)
value = array1[2]
print('value:', value)
print(type(value))

[Output]

array1: [1 2 3 4 5 6 7 8 9]
value: 3
<class 'numpy.int64'>

아래처럼 수정할 수 있습니다.

array1[0] = 9
array1[8] = 0
print('array1:', array1)

[Output]

array1: [9 2 3 4 5 6 7 8 0]

이번엔 2차원 배열로 수정해서 2차원 배열에서의 인덱싱을 알아보겠습니다.

array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3, 3)
print(array2d)

print('(row=0, col=0) index 가리키는 값:', array2d[0, 0])
print('(row=2, col=2) index 가리키는 값:', array2d[2, 2])
print('(row=1, col=2) index 가리키는 값:', array2d[1, 2])
print('(row=0, col=1) index 가리키는 값:', array2d[0, 1])

[Output]

[[1 2 3]
 [4 5 6]
 [7 8 9]]
(row=0, col=0) index 가리키는 값: 1
(row=2, col=2) index 가리키는 값: 9
(row=1, col=2) index 가리키는 값: 6
(row=0, col=1) index 가리키는 값: 2
  • axis 0은 로우 방향의 축, axis 1은 칼럼 방향의 축으로 위에서 사용한 row, col은 사실 넘파이의 ndarray에서는 사용하지 않습니다.
  • 위에 row, col은 [axis 0=0, axis1=2]로 써주는게 사실 맞습니다.
  • 축 기반의 연산에서 axis를 생략하면 axis 0을 의미합니다.

슬라이싱

array1 = np.arange(start=1, stop=10)
array3 = array1[0:3]
print(array3)
print(type(array3))

[Output]

[1 2 3]
<class 'numpy.ndarray'>

1차원 배열에서 인덱스 0~2까지의 값을 가져오므로 [1, 2, 3]이 출력됩니다.

그럼 2차원 배열에선 어떻게 되는지 알아보겠습니다.

array2d = array1.reshape(3,3)
print('array2d:\n', array2d)
print('array2d[0:2, 0:2]:\n', array2d[0:2, 0:2])
print('array2d[0:, 2]:\n', array2d[0:, 2])

[Output]

array2d:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
array2d[0:2, 0:2]:
 [[1 2]
 [4 5]]
array2d[0:, 2]:
 [3 6 9]

마지막 처럼 인덱스를 없애면 모두 출력합니다.

팬시 인덱싱(Fancy Indexing)

array1d = np.arange(start=1, stop=10)
array2d = array1d.reshape(3, 3)

array3 = array2d[[0, 1], 2]
print('array2d[[0, 1], 2]:', array2d[[0, 1], 2])
array4 = array2d[[0,2]]
print(array4)

[Output]

array2d[[0, 1], 2]: [3 6]
[[1 2 3]
 [7 8 9]]

array4처럼 [0, 2]로 지정하면 첫번째와 세번째 줄만 출력되는 것을 볼 수 있습니다.

불린 인덱싱(Boolean Indexing)

12월 초부터 이유한님의 kaggle 커리큘럼에 따라 공부하면서 제일 공부가 필요하다 느꼈던 부분이였습니다.

array1d = np.arange(start=1, stop=10)
# 5보다 큰 값만 검색
array3 = array1d[array1d > 5]
print(array3)

[Output]

[6 7 8 9]

위와 같은 방식으로 []안에 조건문을 넣어서 출력할 수 있습니다. 또한 아래의 방법들로도 활용이 가능합니다.(아웃풋이 같으므로 생략함)

boolean_indexes = np.array([False, False, False, False, False, True, True, True, True])
array3 = array1d[boolean_indexes]
print(array3)
indexes = np.array([5, 6, 7, 8])
array4 = array1d[indexes]
print(array4)

행렬의 정렬(sort, argsort)

np.sort()와 ndarray.sort()가 있습니다.
차이는 np.sort()는 원행렬을 유지한채 정렬된 행렬을 반환하고, ndarray.sort()는 원 행렬 자체를 정렬한 형태로 변환하며 변환값은 None입니다.

org_array = np.array([3, 1, 9, 5])
print(f'원본 행렬: {org_array}')
# np.sort()로 정렬
sort_array1 = np.sort(org_array)
print(f'np.sort() 호출 후 반환된 정렬 행렬: {sort_array1}')
print(f'np.sort() 호출 후 원본 행렬: {org_array}')
# ndarray.sort()로 정렬
sort_array2 = org_array.sort()
print(f'org_array.sort() 호출 후 반환된 정렬 행렬: {sort_array2}')
print(f'org_array.sort() 호출 후 원본 행렬: {org_array}')

[Output]

원본 행렬: [3 1 9 5]
np.sort() 호출 후 반환된 정렬 행렬: [1 3 5 9]
np.sort() 호출 후 원본 행렬: [3 1 9 5]
org_array.sort() 호출 후 반환된 정렬 행렬: None
org_array.sort() 호출 후 원본 행렬: [1 3 5 9]

내림차순으로 정리하려면 [::-1]을 추가하면 됩니다.

sort_array1_desc = org_array[::-1]
print(f'내림차순으로 정렬: {sort_array1_desc}')

[Output]

내림차순으로 정렬: [9 5 3 1]

argsort는 아래와 같이 활용할 수 있습니다.

name_array = np.array(['John', 'Mike', 'Sarch', 'Kate', 'Samuel'])
score_array = np.array([78, 95, 84, 98, 88])

sort_indices_asc = np.argsort(score_array)
print(f'성적 오름차순 정렬 시 score_array의 인덱스: {sort_indices_asc}')
print(f'성적 오름차순으로 name_array의 이름 출력: {name_array[sort_indices_asc]}')

[Output]

성적 오름차순 정렬 시 score_array의 인덱스: [0 2 4 1 3]
성적 오름차순으로 name_array의 이름 출력: ['John' 'Sarch' 'Samuel' 'Mike' 'Kate']

즉 성적을 기준으로 인덱스 값을 추출한 후 그 성적의 인덱스를 활용하여 이름을 배열한다고 생각하면 됩니다.

행렬의 내적, 전치행렬 구하기

행렬의 내적 : np.dot()

A = np.array([[1, 2, 3],
             [4, 5, 6]])
B = np.array([[7, 8],
             [9, 10],
             [11, 12]])
dot_product = np.dot(A, B)
print(f'행렬 내적 결과:\n {dot_product}')

[Output]

행렬 내적 결과:
 [[ 58  64]
 [139 154]]

전치행렬 구하기 : np.transpose()

A = np.array([[1, 2, 3],
             [4, 5, 6]])
transpose_mat = np.transpose(A)
print(f'A의 전치행렬:\n {transpose_mat}')

[Output]

A의 전치행렬:
 [[1 4]
 [2 5]
 [3 6]]

Source: 파이썬 머신러닝 완벽 가이드 / 위키북스

profile
데이터 분석 공부용 벨로그

0개의 댓글