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
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]
마지막 처럼 인덱스를 없애면 모두 출력합니다.
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]로 지정하면 첫번째와 세번째 줄만 출력되는 것을 볼 수 있습니다.
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)
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']
즉 성적을 기준으로 인덱스 값을 추출한 후 그 성적의 인덱스를 활용하여 이름을 배열한다고 생각하면 됩니다.
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]]
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: 파이썬 머신러닝 완벽 가이드 / 위키북스