#Q1. 다음 Numpy의 특징에 대해 틀린 것을 고르시오[2.5점]
1. 반복문 없이 데이터 배열에 대한 처리를 지원함
2. C, JAVA, 포트란 등의 언어와 통합 가능
3. 일반 List에 비해 빠르고, 메모리 효율적
4. Windows 환경에선 패키지 추가 설치 필요 없음

-> 4. Windows 환경에서는 conda로 패키지 관리 필요. jupyter 등을 설치한 상태에서는 추가 필요 없음.

#Q2. 다음 문제를 해결하고 틀린 부분은 고치시오[2.5점]
import numpy as np
ts = [[[1,2,3],[4,5,6],[7,8,9]]]
np.array(ts,int).shape를 입력하면
(3,3,3)이 출력된다.

-> (1,3,3) ( Array Shape : 3rd order tenstor )

#Q3. 다음 문제의 출력 결과를 작성하시오[2.5점]
import numpy as np
ts = [[[1,2,3],[4,5,6],[7,8,9]]]
tn = np.array(ts,int)
tn[:,:,1]

-> tn[:,:,1] 은 배열 tn에서 모든 행과 열을 선택하고, 각 행에서 인덱스 1에 해당하는 요소를 선택함. 그 결과 2,5,8이 선택 됨
-> [2, 5, 8]

#Q4. 각 문제의 O/X 여부를 결정하고 X인 부분은 고치시오[2.5점]
1. 다차원 array를 1차원으로 변환하기 위해서 reshape을 사용할 수 있다. -> o. reshape(-1)
2. Matrix의 경우 앞은 열, 뒤는 행을 의미한다. -> x. 행,열
#Q5. 다음 코드에서 print(a[::2,::3])의 결과는 무엇인지 작성하시오[2.5점]
import numpy as np
# shape: (3, 4)
a = np.array([[1,2,3,4],
							[5,6,7,8],
							[9,10,11,12]], dtype=np.int32)

-> [[1,4],
		[9,12]]
(x:y:z) x : 시작, y:끝 지점 바로 앞, z:step
0행,2행 & 0열,3열 선택

#Q6. 아래 코드의 출력으로 알맞은 것은?[2.5점]
import numpy as np
import copy

a = np.array([[1,2,3,4],
							[5,6,7,8],
							[9,10,11,12]], dtype=np.int32)

b = a
b[0][0] = 5
print(a) #1
print(b) #2 

# 얕은 복사 : a와 b가 같은 객체를 참조하므로, b값 변경시 a에도 영향 o

b = copy.deepcopy(a)
b[0][0] = 50
print(a) #3
print(b) #4 

# 깊은 복사 : b에서의 변경이 a에 영향 x.

# === 선지 ===
	1. [[ 1,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 5,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 1,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[50,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12]]

	2. [[ 5,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 5,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 50,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 50,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12]]

	3. [[ 5,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 5,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 5,  2,  3,  4],  [ 5,  6,  7,  8], [ 9, 10, 11, 12]]
	   [[ 50,  2,  3,  4], [ 5,  6,  7,  8], [ 9, 10, 11, 12]]

--> 3.
cf. 얕은 복사 vs 깊은 복사
얕은 복사에서는 a와 b가 같은 객체를 참조하므로 b에서 값을 변경하면 a에도 영향을 미치지만,
깊은 복사에서는 b에서의 변경이 a에 영향을 미치지 않습니다.

#Q7. 다음 코드에서 print(a)의 결과는?[2.5점]
import numpy as np
a = np.arange(0, 15, 2).reshape(-1, 4)

--> [ [0, 2, 4, 6,],
 [8, 10 ,12 ,14] ]

(1) np.arrange(0, 15, 2) : 0이상 ~ 14이하 값 중 2칸씩 띄어서 선택
(2) reshape(-1,4) : 열 4개로 맞춰서 출력

#Q8. O, X 문제 (X라면 올바르게 고치시오)[2.5점]
a = np.array([4, 9, 10, 3, 1]) 일 떄
np.where(a > 5, 0, 1)의 값은  
array([9, 10])으로 출력 된다.

--> X . [1, 0, 0, 1, 1]
--> where(condition, True, False)에 의해, True -> 0, False -> 1로 출력

#Q9. O, X 문제 (X라면 올바르게 고치시오)[2.5점] 
b = np.array([[5, 49, 11, 1432, 35], [0, 3, 389, 10, 67], [6, 21, 3, 7, 99]]) 일 떄
np.argmax(b, axis = 1) 
np.argmin(b, axis = 0)의 출력 값은
array([2, 0, 1, 0, 2])
array([0, 0, 2])이다.

--> X
np.argmax(b, axis = 1) 행 기준 max값들(1432, 389, 99)의 인덱스 -> array([3, 2, 4])
np.argmax(b, axis = 0) 열 기준 min값들(0, 3, 3, 7, 35)의 인덱스 -> array([1, 1, 2, 2, 0])

#Q10. O, X 문제 (X라면 올바르게 고치시오)[2.5점]
x = np.array([[0, 14, 2],[5, 2, 1], [53, 21, 21]], float)
y = np.array([0, 2 ,1, 2, 2], int)
z = np.array([1, 2, 0, 2, 0], int) 일 때
x[y,z]의 값은
array([14., 21., 5., 21., 53.])이다.

--> array([14. , 21. , 5. , 21. , 53. ])