학습내용
#1 : 넘파이 인덱싱(indexing), 슬라이싱(slicing), 반복(iterating) 1) 1차원 배열 2) 다차원 배열의 인덱싱, 슬라이싱 3) ... 의 사용 4) 다차원 배열의 반복 |
#1 : 넘파이 인덱싱(indexing), 슬라이싱(slicing), 반복(iterating)
1) 1차원 배열
1차원 배열은 리스트나 다른 python sequence처럼 인덱싱, 슬라싱, 반복을 사용할 수 있다.
a = np.arange(10)**3
a
# array([ 0, 1, 8, 27, 64, 125, 216, 343, 512, 729])
a[2]
#8
a[2:5]
#array([ 8, 27, 64])
a[::-1]
#array([729, 512, 343, 216, 125, 64, 27, 8, 1, 0])
a[:6:2] = 1000
a
#array([1000, 1, 1000, 27, 1000, 125, 216, 343, 512, 729])
for i in a:
print(i**(1/3.))
# 9.999999999999998
# 1.0
# 9.999999999999998
# 3.0
# 9.999999999999998
# 4.999999999999999
# 5.999999999999999
# 6.999999999999999
# 7.999999999999999
# 8.999999999999998
2) 다차원 배열의 인덱싱, 슬라이싱
다차원 배열에서는 축당 하나의 인덱스를 가질 수 있다. 이 인덱스들은,(commas)로 분리된 튜플에서 제공된다. 배열의 인덱스로 음수를 사요할 수 있다.
def f(x,y):
return 10*x+y
b = np.fromfunction(f,(5,4),dtype=int)
b
# array([[ 0, 1, 2, 3],
# [10, 11, 12, 13],
# [20, 21, 22, 23],
# [30, 31, 32, 33],
# [40, 41, 42, 43]])
b[2,3] #변수 b의 3번째 행의 4번째 열 값
#23
b[0:5,1] #변수 b의 각 행의 2번째 열 값
# array([ 1, 11, 21, 31, 41])
b[:,1] # 변수 b의 전체 행의 2번째 열 값
# array([ 1, 11, 21, 31, 41])
b[1:3,:] #변수 b의 1, 2행의 전체 열 값
# array([[10, 11, 12, 13],
# [20, 21, 22, 23]])
b[-1] #변수 b의 마지막 행 값
# array([40, 41, 42, 43])
b[-2] #변수 b의 마지막-1 행 값
# array([30, 31, 32, 33])
3) ... 의 사용
... 은 차원이 너무 많을 때 실수를 줄여줄 수 있다. 만약 x가 5차원이라고 할 때 아래와 같이 표현할 수 있다.
- x[1, 2, ...] 은 x[1, 2, : , : , :]와 같다.
- x[ ... , 3]은 x[ : , : , : , : , 3]와 같다.
- x[4, ... , 5, :]은 x[4, : , : , 5 , :]와 같다.
c = np.array([[[0, 1, 2],
[10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
c.shape # 3차원 배열(2차원 두개로 이루어진)
#(2, 2, 3)
위 코드를 살펴보면 c.shape은 (2, 2, 3) 형태인데 이는 1차원 2개가 2차원을 구성하고, 그 2차원 2개가 3차원을 구성한다는 의미이다. 즉, 1차원인 [0,1,2]와 [10,12,13]이 2차원 하나 [[0,1,2],[10,12,13]]를 이루고 또 다른 1차원인 [100,101,102]와 [110,112,113]이 2차원 하나 [[100,101,102],[110,112,113]]를 이룬다. 2차원인 [[0,1,2],[10,12,13]]와 [[100,101,102],[110,112,113]]는 3차원 하나를 [[[0,1,2],[10,12,13]],[[100,101,102],[110,112,113]]] 이룬다.
3차원 | [[[0,1,2],[10,12,13]],[[100,101,102],[110,112,113]]] | |||
2차원 | [[0,1,2],[10,12,13]] | [[100,101,102],[110,112,113]] | ||
1차원 | [0,1,2] | [10,12,13] | [100,101,102] | [110,112,113] |
c = np.array([[[0, 1, 2],
[10, 12, 13]],
[[100, 101, 102],
[110, 112, 113]]])
c.shape # 3차원 배열(2차원 두개로 이루어진)
#(2, 2, 3)
c[1, ...] # c[1, :, :], c[1]과 똑같다.
# array([[100, 101, 102],
# [110, 112, 113]])
c[..., 2] # c[:,:,2]와 똑같다.
array([[ 2, 13],
[102, 113]])
- c[1, ...]은 두번째 2차원 배열을 의미한다.
- c[... , 2]는 2차원 테이블 전체의, 전체 행의, 3번 째 값을 의미한다. 결과는 2차원이 나온다.
- 3차원에서 하나를 끄집어 낸다는 것은 2차원이 된다는 것, 2차원에서 하나를 끄집어 낸다는 것은 1차원이 된다는 것.
4) 다차원 배열의 반복
다차원 배열을 for문을 적용하면 axis = 0 기준으로 적용된다. 만약 배열의 모든 원소를 for문을 적용하고 싶을 경우 .reshape()을 사용해도 되지만, .flat을 사용할 수도 있다.
def f(x,y):
return 10*x+y
b = np.fromfunction(f,(5,4),dtype=int)
for row in b:
print(row)
# [0 1 2 3]
# [10 11 12 13]
# [20 21 22 23]
# [30 31 32 33]
# [40 41 42 43]
- 2차원일 때 for문을 적용해 출력하면 1차원 배열이 나온다.
for element in b.flat:
print(element)
# 0
# 1
# 2
# 3
# 10
# 11
# 12
# 13
# 20
# 21
# 22
# 23
# 30
# 31
# 32
# 33
# 40
# 41
# 42
# 43
'파이썬 > Numpy(넘파이)' 카테고리의 다른 글
[NumPy] 5. 넘파이 브로드캐스팅, 배열 인덱싱, 불 인덱싱 (0) | 2021.10.15 |
---|---|
[NumPy] 4. 넘파이 차원 변환(Shape Manipulation) (0) | 2021.10.13 |
[NumPy] 2. 넘파이 연산, 축, 배열 출력 (0) | 2021.10.12 |
[NumPy] 1. 넘파이 개념, ndarray, 배열 생성 (0) | 2021.10.12 |
댓글