array형태의 데이터를 다양한 차원별로 인덱싱하고 슬라이싱하는 방법을 정리합니다.
인덱싱
-
파이썬 리스트와 동일한 개념으로 사용
-
,를 사용하여 각 차원의 인덱스에 접근 가능
1차원 벡터 인덱싱
1
2
3
| # 1에서 부터 9 까지의 1차원 ndarray 생성
array1 = np.arange(start=1, stop=10)
print("array1:",array1)
|
array1: [1 2 3 4 5 6 7 8 9]
1
2
3
4
| # index는 0 부터 시작하므로 array1[2]는 3번째 index 위치의 데이터 값을 의미
value = array1[2]
print('value:',value)
print(type(value))
|
value: 3
<class 'numpy.int32'>
1
| print("맨 앞의 값:", array1[0]) # 양수 인덱스 (맨 앞 요소)
|
맨 앞의 값: 1
1
| print('앞에서 세번째 값:',array1[3])
|
앞에서 세번째 값: 4
1
| print('맨 뒤의 값:',array1[-1], ', 맨 뒤에서 두번째 값:',array1[-2])
|
맨 뒤의 값: 9 , 맨 뒤에서 두번째 값: 8
index로 특정 위치값 출력하기
1
9
index의 값 바꾸기
1
2
| array1[3] = 100
print(array1)
|
[ 1 2 3 100 5 6 7 8 9]
2차원 행렬 인덱싱
- 인덱싱을 하면 결과물은 차원수가 줄어들거나 변형되어 출력된다.
1
2
| array2 = np.arange(15).reshape(3, 5) #5행 2열로 reshape
print(array2)
|
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
1
2
3
4
| # x의 0번째 행
print("array2[0]:", array2[0]) # 양수 인덱스 (맨 앞 요소)
# 기존은 2차원 행렬이지만 1차원으로 변경되어 출력
|
array2[0]: [0 1 2 3 4]
1
2
| # x의 1번째 행, -1번째(마지막) 열
print("(row=1,col=-1) index 가리키는 값:", array2[1,-1])
|
(row=1,col=-1) index 가리키는 값: 9
1
| print('(row=0,col=1) index 가리키는 값:', array2[0,1] )
|
(row=0,col=1) index 가리키는 값: 1
1
| print('(row=1,col=0) index 가리키는 값:', array2[1,0] )
|
(row=1,col=0) index 가리키는 값: 5
1
| print('(row=2,col=2) index 가리키는 값:', array2[2,2] )
|
(row=2,col=2) index 가리키는 값: 12
3차원 텐서 인덱싱
1
2
3
| # 4행 3열 array를 3차원(3개)으로 생성
array3 = np.arange(36).reshape(3, 4, 3)
print(array3)
|
[[[ 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]]]
1
2
| # 0번째 index위치의 4행 3열의 array를 출력
print("array3[0]:\n",array3[0])
|
array3[0]:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
1
2
| # 1번째 index위치의 4행 3열의 array를 출력
print("array3[1]:\n",array3[1])
|
array3[1]:
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]
1
2
| # 4행 3열의 array에서 0번째 array에서 1번째 행에 있는 값 출력
print('(array=1, rows=2) index 가리키는 값:', array3[0,1] )
|
(array=1, rows=2) index 가리키는 값: [3 4 5]
1
2
| # 4행 3열의 array에서 1번째 array에서 2번째 행에 있는 값 출력
print('(array=1,rows=2) index 가리키는 값:', array3[1,2] )
|
(array=1,rows=2) index 가리키는 값: [18 19 20]
1
2
| #4행 3열의 1번째 array에서 2번째 행에서 1번째 값을 출력
print('(array=1, row=2, col=1의 ) index 가리키는 값:', array3[1,2,1] )
|
(array=1, row=2, col=1의 ) index 가리키는 값: 19
슬라이싱
1차원 벡터 슬라이싱
1
2
| array1 = np.arange(10)
print(array1)
|
[0 1 2 3 4 5 6 7 8 9]
1
| print("array1[1:]:",array1[1:])
|
array1[1:]: [1 2 3 4 5 6 7 8 9]
2차원 행렬 슬라이싱
1
2
| array2 = np.arange(10).reshape(2, 5)
print(array2)
|
[[0 1 2 3 4]
[5 6 7 8 9]]
1
| print("array2[0, :2]:",array2[0, :2])
|
array2[0, :2]: [0 1]
1
| print("array2[:1, :2]:",array2[:1, :2])
|
array2[:1, :2]: [[0 1]]
1
| print("array2[:, :2]:\n",array2[:, :2])
|
array2[:, :2]:
[[0 1]
[5 6]]
출력값은 동일한 2차원으로 indexing처럼 차원값이 변하지는 않는다.
1
2
| # indexing을 하게 되면 당연히 차원값도 변경이 될 수 있다.
print("array2[0, :2]:",array2[0, :2])
|
array2[0, :2]: [0 1]
1
2
| # indexing이 없이 출력한다면 차원값은 변하지 않으면서 동일한 값을 출력할 수 있다.
print("array2[:1, :2]:",array2[:1, :2])
|
array2[:1, :2]: [[0 1]]
3차원 텐서 슬라이싱
1
2
| array3 = np.arange(54).reshape(2, 9, 3)
print(array3)
|
[[[ 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 50]
[51 52 53]]]
1
| print("array3[:1, :2, :]:\n",array3[:1, :2, :])
|
array3[:1, :2, :]:
[[[0 1 2]
[3 4 5]]]
1
| print("array3[:1, :2, :]:\n",array3[:1, :2, :])
|
array3[:1, :2, :]:
[[[0 1 2]
[3 4 5]]]
Boolean indexing
1
2
| array1 = np.arange(start=1, stop=10)
print(array1)
|
[1 2 3 4 5 6 7 8 9]
1
2
3
4
| # array1의 값에서 5이상 T/F 출력
var1 = array1 > 5
print("var1:",var1)
print(type(var1))
|
var1: [False False False False False True True True True]
<class 'numpy.ndarray'>
1
2
3
4
| # [ ] 안에 array1 > 5 Boolean indexing을 적용
print(array1,"\n")
array3 = array1[array1 > 5]
print('array1 > 5 불린 인덱싱 결과 값 :', array3)
|
[1 2 3 4 5 6 7 8 9]
array1 > 5 불린 인덱싱 결과 값 : [6 7 8 9]
1
2
3
4
5
6
| # ndarray형태로 T/F 생성
boolean_indexes = np.array([False, False, False, False, False, True, True, True, True])
# 생성된 T/F 기준과 array1 비교하여 필터링 -> True인 값만 []에 담긴다.
array3 = array1[boolean_indexes]
print('불린 인덱스로 필터링 결과 :', array3)
|
불린 인덱스로 필터링 결과 : [6 7 8 9]
1
2
3
| indexes = np.array([5,6,7,8])
array4 = array1[ indexes ]
print('일반 인덱스로 필터링 결과 :',array4)
|
일반 인덱스로 필터링 결과 : [6 7 8 9]
1
2
3
4
5
6
7
8
9
10
11
| # 응용
# for 문으로 T/F 추출하기
array1d = np.arange(start=1, stop=10)
target = []
for i in range(0, 9):
if array1d[i] > 5:
target.append(array1d[i])
array_selected = np.array(target)
print(array_selected)
|
[6 7 8 9]
1
| print(array1d[array1 > 5])
|
[6 7 8 9]
댓글남기기