In [1]:
from IPython.display import display, HTML
display(HTML("<style>.container { width:90% !important; }</style>"))
# 코드 셀의 너비를 조정하는 코드입니다. 신경쓰지 마세요
ndarray의 데이터에 access 하기¶
1차원 배열의 인덱스 접근¶
In [2]:
import numpy as np
In [3]:
np.random.seed(23)
In [4]:
x = np.random.randint(0, 100, 10)
In [5]:
x
Out[5]:
array([83, 40, 73, 54, 31, 76, 91, 39, 90, 25])
In [6]:
x[3]
Out[6]:
54
In [7]:
x[-1]
Out[7]:
25
다차원배열의 인덱스 접근¶
In [8]:
X = np.array([[13, 22, 49, 42, 80],
[91, 63, 58, 20, 34],
[60, 40, 16, 37, 66],
[ 2, 44, 16, 87, 84]])
In [9]:
X
Out[9]:
array([[13, 22, 49, 42, 80], [91, 63, 58, 20, 34], [60, 40, 16, 37, 66], [ 2, 44, 16, 87, 84]])
In [10]:
X[1][2]
Out[10]:
58
In [11]:
# 콤마의 왼쪽이 행!, 콤마의 오른쪽은 열 을 적어준다
In [12]:
X[1, 2]
Out[12]:
58
In [13]:
X[2, 4]
Out[13]:
66
Slicing - 잘라서 가져오기¶
1차원 벡터¶
In [14]:
x
Out[14]:
array([83, 40, 73, 54, 31, 76, 91, 39, 90, 25])
In [15]:
x[2 : 6+1]
Out[15]:
array([73, 54, 31, 76, 91])
2차원 행렬¶
In [16]:
X
Out[16]:
array([[13, 22, 49, 42, 80], [91, 63, 58, 20, 34], [60, 40, 16, 37, 66], [ 2, 44, 16, 87, 84]])
In [17]:
X[ 1:2+1, 1:3+1 ]
Out[17]:
array([[63, 58, 20], [40, 16, 37]])
In [18]:
X[ :2+1 , :1+1 ]
Out[18]:
array([[13, 22], [91, 63], [60, 40]])
In [19]:
X[ 3 , 2: ]
Out[19]:
array([16, 87, 84])
In [20]:
# 세번째 행을 가져오세요
In [21]:
X[2, ]
Out[21]:
array([60, 40, 16, 37, 66])
In [22]:
X[2, :]
Out[22]:
array([60, 40, 16, 37, 66])
In [23]:
# 세번째 열을 가져오세요
In [24]:
X[ , 2]
Cell In [24], line 1 X[ , 2] ^ SyntaxError: invalid syntax
In [ ]:
# 전체 행의, 특정 열만 가져올 때는 먼저 행 전체를 슬라이싱 해줘야 한다
In [25]:
X[ : , 2]
Out[25]:
array([49, 58, 16, 16])
In [ ]:
연속되지 않은 데이터를 slicing 할 때는, 리스트나 튜플을 넣어준다.¶
In [26]:
# 첫번째, 세번째, 네번째 열을 가져오세요
In [27]:
X[ : , (0, 2, 3)]
Out[27]:
array([[13, 49, 42], [91, 58, 20], [60, 16, 37], [ 2, 16, 87]])
In [28]:
X[ : , [0, 2, 3] ]
Out[28]:
array([[13, 49, 42], [91, 58, 20], [60, 16, 37], [ 2, 16, 87]])
2차원 배열의 데이터 변경¶
In [29]:
X
Out[29]:
array([[13, 22, 49, 42, 80], [91, 63, 58, 20, 34], [60, 40, 16, 37, 66], [ 2, 44, 16, 87, 84]])
In [30]:
# 맨 끝에 있는 84를 100으로 변경
In [31]:
X[ -1, -1 ] = 100
In [32]:
X
Out[32]:
array([[ 13, 22, 49, 42, 80], [ 91, 63, 58, 20, 34], [ 60, 40, 16, 37, 66], [ 2, 44, 16, 87, 100]])
Slicing 할때, 주의할 점!!!!¶
In [33]:
X
Out[33]:
array([[ 13, 22, 49, 42, 80], [ 91, 63, 58, 20, 34], [ 60, 40, 16, 37, 66], [ 2, 44, 16, 87, 100]])
In [34]:
Y = X[ 0 : 1+1 , 0 : 2+1 ]
In [35]:
Y
Out[35]:
array([[13, 22, 49], [91, 63, 58]])
In [36]:
Y[0, 0] = 100 # Y의 원소를 바꾼다.
In [37]:
Y
Out[37]:
array([[100, 22, 49], [ 91, 63, 58]])
In [38]:
X # X의 원소도 바뀌었다.
Out[38]:
array([[100, 22, 49, 42, 80], [ 91, 63, 58, 20, 34], [ 60, 40, 16, 37, 66], [ 2, 44, 16, 87, 100]])
In [39]:
X[0, 0] = 13 # X의 원소를 바꾼다.
In [40]:
Y # Y의 원소도 바뀌었다.
Out[40]:
array([[13, 22, 49], [91, 63, 58]])
In [ ]:
# 위에서 보듯이, X와 X를 참조해서 만들어진 Y는 메모리를 공유하기 때문에
# 한 쪽의 값을 변경하면 양 쪽 모두 변경된다.
# copy() 함수를 사용해 사본을 만들면 이런 문제를 해결할 수 있다.
Copy¶
In [41]:
Y = X[ 0 : 1+1 , 0 : 2+1 ].copy()
In [42]:
Y
Out[42]:
array([[13, 22, 49], [91, 63, 58]])
In [43]:
Y[0, 0] = 100
In [44]:
Y
Out[44]:
array([[100, 22, 49], [ 91, 63, 58]])
In [45]:
X
Out[45]:
array([[ 13, 22, 49, 42, 80], [ 91, 63, 58, 20, 34], [ 60, 40, 16, 37, 66], [ 2, 44, 16, 87, 100]])
In [ ]:
# copy() 를 사용해 만든 Y는 X와 메모리를 공유하지 않는다
'Python > Numpy' 카테고리의 다른 글
Numpy의 연산 - 브로드캐스팅(Broadcasting) (0) | 2022.11.24 |
---|---|
Numpy Boolean 조건문으로 배열 인덱싱(Boolean Indexing) (0) | 2022.11.24 |
Numpy의 축(axis) 연산 (0) | 2022.11.23 |
Numpy의 난수 배열 생성 random, randint (0) | 2022.11.23 |
Numpy의 배열 생성 arange, linspace, reshape (0) | 2022.11.23 |