[Python] Numpy (3) - 슬라이싱 , 서브배열
배열 관련 포스팅
2020/05/28 - [python] - [python] Numpy 데이터타입, 메모리저장, 배열
[python] Numpy 데이터타입, 메모리저장, 배열
Numpy 란? C언어로 개발되었으며, 계산을 위한 라이브러리로서 다차원 배열을 처리하는데 필요한 기능을 제공합니다. Numpy 데이터 타입 # numpy : ndarray import numpy as np nn = [1, 2, 3.5] nn1 = (6,7,8,9)..
lightchan.tistory.com
Numpy 슬라이싱
a = np.array([1,2,3,4,5])
print(a, type(a), end='\n\n')
print(a[1], end='\n\n')
print(a[1:5:2], end='\n\n')
print(a[-5:-2], end='\n\n')
print(a[1:], ' ' , a[:3], end='\n\n')
print('==========================')
a = np.array([[1,2,3,4], [5 ,6,7,8], [9,10,11,12]])
print(a, a.shape, end='\n\n')
#print(a[:])
print(a[1:], end='\n\n')
print(a[0], a[0][0],a[0,0], a[[0]], end='\n\n')
print(a[0,0], end='\n\n')
print(a[1:], end='\n\n')
print(a[1:, 0:2], end='\n\n')
b = a
print(b, end='\n\n')
# 출력 결과
[1 2 3 4 5] <class 'numpy.ndarray'>
2
[2 4]
[1 2 3]
[2 3 4 5] [1 2 3]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]] (3, 4)
[[ 5 6 7 8]
[ 9 10 11 12]]
[1 2 3 4] 1 1 [[1 2 3 4]]
1
[[ 5 6 7 8]
[ 9 10 11 12]]
[[ 5 6]
[ 9 10]]
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
소스코드의 일부를 보시면 a[값1:값2] 로 작성되어있는 의미는 다음과 같습니다.
- 1차원 배열의 자료를 출력하고, 값1+1로 시작하여 값2의 범위까지 출력하는 것을 뜻합니다.
그 밑의 출력 문장을 보시면 a[값1:값2:값3] 으로 값3까지 있는 문장에서는 값3만큼 띄어넘어 출력하는 것을 뜻합니다.
- 여기서는 1:5 만 출력한다면 2 3 4 5가 출력되겠지만 값3에 2를 넣엇기때문에 2 4 가 출력됩니다.
shape 함수는 해당하는 배열이 몇행 몇열의 배열인지 출력해주는 함수입니다.
2차원 배열에서는 행과 열로 구성되고 있기 때문에 [값1:값2 , 값3,값4] 의 범위로 지정하게 됩니다.
a[값1 : ] 의 경우는 값1의 행부터 마지막 행까지 출력되는 것을 의미하게 됩니다.
Numpy 복사하기
a = np.array([[1,2,3,4], [5 ,6,7,8], [9,10,11,12]])
b = a # 이건 주소치환
b[0][0] = 100
print(a)
print()
print(b)
print('**' * 10)
print()
c = np.copy(a) # 원본을 가지고 또 다른 배열주소 하나 만들어서 저장
c[0][0] = 200
print(a)
print('**'*10)
print(c)
a 배열을 만든후 주소 치환을 이용하여 b에 그대로 복사하여 동일하게 출력 된 것을 확인 할 수 있습니다.
그 다음 np.copy() 를 이용하여 c 에 2차원 배열 a를 다른 주소를 통하여 c에 복사하게 됩니다.
여기서 복사한 2차원 배열 c 의 값이 바뀌더라도 기존 a 배열에는 영향이 없습니다.
Numpy 의 서브Array
d=a[:2, 1:3]
print(a, end='\n\n') # 2 3 이 부분을 서브 array라고 한다
print(d, end='\n\n') # 6 7
print(a)
# 출력 결과
[[100 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
[[2 3]
[6 7]]
[[100 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
d 배열에 a 배열의 1 ~ 2행과 2 ~ 3 열의 값을 d 배열에 저장하였습니다.
그에따른 결과는 다음과 같으며 이것을 서브배열이라고 칭합니다. 이후 다시 a 배열을 출력해보면
기존 a 배열에는 영향이 없는 것을 알 수 있습니다.
그 외 추가 예제
a = np.array([[1,2,3,],[4,5,6],[7,8,9]])
r1 = a[1, :]
print(r1)
print(r1, r1.shape)
print()
r2 = a[1:2, :]
print(r2, r2.shape)
print()
# 출력 결과
[4 5 6]
[4 5 6] (3,)
[[4 5 6]] (1, 3)
위에서 설명 드렸던 것처럼 .shape() 함수는 행렬의 차원을 개념으로 표현하는 것입니다.
여기서 r1 의 a[1, :] 는 a[1,] 과 동일한 의미로 해석 될 수 있습니다. 출력이 [4 5 6] 이지만 (3, )과 같이 출력 되는 이유는
1차원 배열 형태로 출력하였기 때문입니다.
그 차이를 비교하기 위해 r2 를 확인해보시면 쉽게 이해하실 수 있습니다.
위에 설명을 보시면 2차원 배열의 경우 (값1 : 값2 , 값3 : 값4 ) 로 범위를 지정하여 이번에는 (1, 3) 과 같이 출력 된 것을 알 수 있습니다.