DataScience/Numpy
Numpy Slicing 주의점, Copy, boolean 연산
leopard4
2022. 11. 23. 13:10
Slicing 할때, 주의할 점!!!!¶
In [329]:
X[ 0:1+1 , 0:2+1]
Out[329]:
array([[84, 41, 74], [77, 92, 40]])
In [330]:
Y = X[ 0:1+1 , 0:2+1]
In [331]:
Y
Out[331]:
array([[84, 41, 74], [77, 92, 40]])
In [332]:
Y[0,0] = 100
In [333]:
Y
Out[333]:
array([[100, 41, 74], [ 77, 92, 40]])
In [334]:
X
Out[334]:
array([[100, 41, 74, 55, 32], [ 77, 92, 40, 91, 26], [ 52, 7, 46, 13, 50], [ 67, 76, 86, 70, 100]])
In [335]:
X[0,0] = 13
In [336]:
Y
Out[336]:
array([[13, 41, 74], [77, 92, 40]])
In [337]:
X # 메모리를 공유하기 때문.
Out[337]:
array([[ 13, 41, 74, 55, 32], [ 77, 92, 40, 91, 26], [ 52, 7, 46, 13, 50], [ 67, 76, 86, 70, 100]])
In [338]:
Y = X[ 0:1+1 , 0 : 2+1 ]
Copy¶
In [340]:
Y = X[ 0:1+1 , 0 : 2+1 ].copy() # 메모리 공유가 해제되고 새로운 메모리 영역에 할당.
In [342]:
Y[ 0, 0 ] = 100
In [344]:
Y
Out[344]:
array([[100, 41, 74], [ 77, 92, 40]])
In [345]:
X
Out[345]:
array([[ 13, 41, 74, 55, 32], [ 77, 92, 40, 91, 26], [ 52, 7, 46, 13, 50], [ 67, 76, 86, 70, 100]])
원하는 행, 열을 슬라이싱해서 가져오는 방법¶
In [347]:
X
Out[347]:
array([[ 13, 41, 74, 55, 32], [ 77, 92, 40, 91, 26], [ 52, 7, 46, 13, 50], [ 67, 76, 86, 70, 100]])
In [348]:
# X의 첫번째 행과 세번째 행 중에서,
In [354]:
X[ [0,2] , -3:]
Out[354]:
array([[74, 55, 32], [46, 13, 50]])
중복된것 제거한 값만 리스트로 가져오기¶
In [357]:
page_view = [1,5,3,1,40,22,33,56,12,1,5,3]
In [358]:
set(page_view)
Out[358]:
{1, 3, 5, 12, 22, 33, 40, 56}
In [362]:
page_view = np.array( page_view )
In [363]:
page_view
Out[363]:
array([ 1, 5, 3, 1, 40, 22, 33, 56, 12, 1, 5, 3])
In [364]:
# 중복된 데이터를 제거해주는 함수가 있다.
np.unique( page_view )
Out[364]:
array([ 1, 3, 5, 12, 22, 33, 40, 56])
boolean 연산¶
In [365]:
X
Out[365]:
array([[ 13, 41, 74, 55, 32], [ 77, 92, 40, 91, 26], [ 52, 7, 46, 13, 50], [ 67, 76, 86, 70, 100]])
In [366]:
# 80보다 큰 데이터는 몇개??
In [371]:
X>80
Out[371]:
array([[False, False, False, False, False], [False, True, False, True, False], [False, False, False, False, False], [False, False, True, False, True]])
In [374]:
(X > 80).sum()
Out[374]:
4
In [375]:
# 80 보다 큰 데이터를 가져와라
In [376]:
X[X>80]
Out[376]:
array([ 92, 91, 86, 100])
In [377]:
# X 의 데이터 중에서, 50보다 크고 80보다 작은 데이터를 가져오시오.
In [380]:
X>50 and X<80
--------------------------------------------------------------------------- ValueError Traceback (most recent call last) Cell In [380], line 1 ----> 1 X>50 and X<80 ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [381]:
# and, or 연산자는, 조건문에서만 사용하는것!!
# 만약 ~ 하면, ~ 해라. 조건 + 액션(행동)
# if ..... :
# ........
In [ ]:
# 데이터를 가져오라는, 데이터 엑세스에서는
# and , or 를 사용하지 않고
# & , | 를 사용합니다.
In [383]:
X[ (X>50) & (X<80) ] # () 괄호를 반드시 쓰도록.
Out[383]:
array([74, 55, 77, 52, 67, 76, 70])
In [384]:
(X>50) & (X<80)
Out[384]:
array([[False, False, True, True, False], [ True, False, False, False, False], [ True, False, False, False, False], [ True, True, False, True, False]])
In [385]:
# X의 데이터 중에서 30보다 작거나 90보다 큰 데이터만 가져오시오.
In [387]:
(X < 30) | (X >90)
Out[387]:
array([[ True, False, False, False, False], [False, True, False, True, True], [False, True, False, True, False], [False, False, False, False, True]])
In [388]:
X[(X < 30) | (X >90)]
Out[388]:
array([ 13, 92, 91, 26, 7, 13, 100])