#지원

1. python 리스트는 다양한 데이터 유형을 포함할 수 있지만, 
numpy 배열의 모든 요소는 동일 유형이어야 한다.

(O)

2. np.linspace(1, 11, 10)의 결과는 array([1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]) 이다.

(X, np.linspace(1,10,10)의 결과이다. linspace는 끝 '이하'이기 때문에 끝값이 데이터에 반드시 포함되어야 한다.
arrange(stop값 포함 X)와 linspace(stop값 포함))

3. 
a = np.array([
    [1, 2, 3, 4, 5],
    [11, 12, 13, 14, 15],
    [21, 22, 23, 24, 25]])
print(a[::2, ::2])
의 결과값은 
[[ 1 3 5]
[21 23 25]] 이다.

(O) [::2,::2] →행을 2칸씩 띄우며, 열도 2칸씩 띄워 출력

4. 
arr1 = np.arrange(15).reshape(1, 2, 5)
arr2 = np.arrange(20).reshape(3, 5)
위의 두 배열은 broadcasting이 가능하다.

(X, 맨 뒤는 5로 동일하지만, 2와 3이 동일하거나, 둘 중 하나가 1이 아니기 때문에 broadcast되지 않습니다.)
#broadcasting이 가능한 조건 : 브로드캐스트 하기 위해서는 두 배열이 뒤에서부터 대응하는 축의 크기가 동일하거나, 1이어야만 합니다.
broadcasting 가능한 경우 ex) 
arr1 = np.arrange(15).reshape(3, 1, 5)
arr2 = np.arrange(20).reshape(4, 5)
-> 맨 뒤는 5로 동일하고, 1과 4는 둘 중 하나가 1이기 때문에 braodcast가 된다.

5. arr[-3]처럼, 인덱스에 -n이 붙으면 뒤에서 n번째를 표현하는 것이다. 

(O)

출처
3. <https://076923.github.io/posts/Python-numpy-5/>
4. <https://blog.naver.com/PostView.naver?blogId=dhtjdqls2&logNo=222178947654&redirect=Dlog&widgetTypeCall=true&directAccess=false>

#홍규

배열에 boolean 자료형을 원소로 포함 할 수 있는가 < O
벡터 연산을 활용하면 for문에 비해 속도가 빠르다 <  O
벡터의 사칙연산은 차원이 같아야 수행된다 
ex) [[1,2,3],[2,3,3]]은 같은 모양의 배열과만 연산이 가능하다.
배열의 데이터타입을 설정 할 수 있다 < dtype=np.#데이터형식

브로드캐스팅 
[조건 : 같은 차원이 짝이 맞을 경우
	(차원에 대해 축의 길이, 즉 기준이 되는 행이나 열의 길이가 동일 한 경우)
			차원의 크기가 1인 경우](<https://sacko.tistory.com/16>)
#하이퍼 링크 참조하세요!

//----------------

배열끼리 사칙연산 시키기

1. 사용자가 두 정수, n, m 를 입력하게 한다. (입력 예시 # 1 3)
2. 프로그램은 abs(n)을 행의 크기로, abs(m)을 열의 크기로 설정하여 배열을 생성한다.
2_1 그리고, 해당 배열의 원소는 n과 m사이에 존재하는 정수들을 이용하여 랜덤하게 채운다.
3. 이용자는 해당 프로그램에 대한 평가를 내린다. 
평가는 이용자가 입력한 행렬의 크기 만큼 받는다.
ex_1 이용자가 2, 3 을 입력하였다면 6개의 정수를 입력받는다.
ex_2 이용자가 2, -7을 입력하였다면 14개의 정수을 입력받는다.
평가의 방법은 정수의 크기로 결정한다. 
- 정수가 자연수인 경우 True,
 0이거나 음수인 경우 False로 취급하여 난수가 저장된 배열과 동일한 크기의 배열에 저장한다. 

>> 여기서 프로그램은 두개의 2차원 배열을 저장하고 있어야 한다.
	1번, 난수가 저장된 배열.
	2번, 사용자가 평가한 점수가 저장된 배열.

2번에 따라, 1번에 저장되어있는 정보의 출력을 결정한다.

ex ) [[2,1],[1,2]]#난수가 저장된 배열
			[[-2,3],[3,2]]#사용자의 평가가 저장된 배열

출력은 [[1],[1,2]]가 나옵니다.

평가 요소

rand의 사용
boolean 인덱싱을 활용 가능

///진짜진짜

#우리의 친구 chatGPT

import numpy as np

# 사용자로부터 두 정수 n, m을 입력받음
n = int(input())
m = int(input())

#행의 크기를 abs(n), 열의 크기를 abs(m)으로 설정하여 배열 생성
arr = np.random.randint(min(n,m), max(n,m),(abs(m),abs(n)))

#평가를 위한 배열 생성 및 사용자로부터 정수 입력 받음
score_arr = np.zeros([abs(n),abs(m)])
for i in range(abs(n)):
    for j in range(abs(m)):
        num=int(input())

        if num > 0:
            score_arr[i][j] = True
        else:
            score_arr[i][j] = False

# 평가 결과 출력
for i in range(abs(n)):
    for j in range(abs(m)):
        if score_arr[i][j]:
            print(arr[i][j],end="")
        else:
            print('-',end="")
    print("\\n")
#동선

이론 문제.
1. numpy는 C언어와 통합이 불가능하다.
(x : numpy는 C언어를 베이스로 하고 있으며, C 언어와 통합이 가능하다.)

2. numpy의 경우 파이썬과 다르게 배열을 생성하고 a = [1,2,3,4]를 넣으면 배열에
  1,2,3,4 각각의 주소가 저장된다.
(x : numpy의 경우 배열을 생성하고 a = [1,2,3,4]를 넣으면 배열에 그대로 1,2,3,4가
 각각 들어간다.)

3. numpy에서 array를 합칠 경우 vstack은 행을 붙이고, hstack은 열을 붙인다.
(o : vstack은 행을 붙일 수 있고, hstack은 열을 붙일 수 있다.)

4. numpy에서는 1차원 이상의 배열부터 행렬이라고 하며, 행렬을 활용한 연산이 가능하다.
(x : numpy에서는 행렬을 이용한 연산은 가능하지만, 1차원의 배열은 vector라고 한다.)

5. np.linspace(1,10)에서 나오는 벡터의 간격은 np.linspace(11,20,50)과 np.linspace(11,50)에서 나오는
   벡터의 간격과 동일하다.
(o : linspace의 경우 default값이 50으로 설정되어 있기 때문에, 갯수를 입력하지 않을 시
구간의 값이 50개로 나뉘어져 나오게 된다. 따라서 차이가 같은 구간에서의 벡터의 간격은 동일하다.)

출처.
2. <https://velog.io/@hey-chocopie/numpy%EB%9E%80-numpy-array-%EC%A0%95%EB%A6%AC-numpy-array-%EC%82%AC%EC%9A%A9-%EA%B0%80%EB%8A%A5-%ED%95%A8%EC%88%98-%EC%A0%95%EB%A6%AC-indexing-slicing-numpy-array-%EC%99%84%EC%A0%84-%EC%A0%95%EB%A6%AC-day8-1-%EB%84%A4%EC%9D%B4%EB%B2%84-ai%EB%B6%80%EC%BA%A0-%EB%AD%90%ED%95%A0%EA%B9%8C>

4. <https://continuous-development.tistory.com/116>

5. <https://spacecollection.co.kr/9>

실습문제.
문제1 : 5x5 크기의 2차원 numpy 배열을 생성하시오. (3점)
이 배열의 모든 요소의 합이 100 이상이 되도록 무작위로 배열을 채우는 함수를 구현하세요. (5점)
이때, 배열의 각 요소들은 0 이상 10 이하로 설정합니다. (2점)
(np.random.randint 사용)

실행코드.
import numpy as np

def random(arr):
    while arr.sum() < 100:
        arr = np.random.randint(0, 11, size=(5, 5))
    return arr

random(arr)

출력 예시)
array([[ 7,  8,  4,  6,  8],
       [10, 10,  7,  4,  4],
       [ 6,  8,  6,  4,  7],
       [10,  6,  6,  6,  4],
       [ 5,  8, 10,  8,  2]])

array([[ 3,  0,  0,  2, 10],
       [ 7,  0,  6,  2,  5],
       [ 8,  7,  7,  8,  4],
       [ 6,  1,  8,  0,  7],
       [ 4,  4,  3,  3,  6]])

#시현

arr2=np.array([[1,2,3],[4,5,6])

print(arr1.shape,arr2.shape)  // shape를 프린트

#ndim // 차원

print(arr.ndim,arr2.ndim)

#size
print(arr.size,arr2.size)

dtype -> 형을 바꿀 수 있음
float뒤 숫자 -> 몇비트를 사용하는지

#데이터 타입이 혼재하는 경우
arr=np.array([1,2,3.4])
유니코드???

np=np.zeros([2,2]) -> 0으로 된 함수 만들라

np.full((2,3),5))
np.eye() -> 대각원소  k값 어디서부터 시작인지
문제)np.linspace와  np.arrange 차이!! -> 끝값의 차이 (이론문제)
np.logspace(1,10,10,base=2) base가 없다면 상용로그

!pip install matplotlib

np.random.seed(1) // 시작점만 같으면 항상 동일한 난수 생성
arr=np.random.rand(10)

문제)print(arr[-1])?
arr=np.array([0,1,2,3,4,5,6,7,8,9])

#실습문제
1.np. full로 (4,4)형의 배열을 만들고 
대각선들의 합을 각각 구하여라
2.
#준희

- up.eye()는 항등행렬이다
- 행렬에서 np.inner는 i번째 행벡터와 j번째 열벡터 사이의 내적을 뜻한다

#

#최종본

import numpy as np

n, m=input().split()
n = int(n)
m = int(m)

# 행의 크기를 abs(n), 열의 크기를 abs(m)으로 설정하여 배열 생성
arr = np.random.randint(min(abs(n),abs(m)), max(abs(n),abs(m)), (abs(n),abs(m)))

# 평가를 위한 배열 생성 및 사용자로부터 정수 입력 받음
score_arr = np.zeros([abs(n),abs(m)])
for i in range(abs(n)):
    for j in range(abs(m)):
        num = int(input())
        if num > 0:
            score_arr[i][j] = True
        else:
            score_arr[i][j] = False

# 평가 결과 출력
result_arr = np.where(score_arr, arr, '-')
print(result_arr)