#지원
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)