<jupyter_start><jupyter_text>Day11 - Numpy I<jupyter_code>%time
listA = list(range(10))
listB = list(range(10))
listC = []
for i in range(len(listA)):
    listC.append(listA[i]*listB[i])

print(listA, listB, listC)
%time
listA = list(range(1000))
listB = list(range(1000))
listC = []
for i in range(len(listA)):
    listC.append(listA[i]*listB[i])

#print(listA, listB, listC)
%time
listA = list(range(10000))
listB = list(range(10000))
listC = []
for i in range(len(listA)):
    listC.append(listA[i]*listB[i])

#print(listA, listB, listC)
%time
listA = list(range(100000))
listB = list(range(100000))
listC = []
for i in range(len(listA)):
    listC.append(listA[i]*listB[i])

#print(listA, listB, listC)
%time
listA = list(range(100000000))
listB = list(range(100000000))
listC = []
for i in range(len(listA)):
    listC.append(listA[i]*listB[i])

#print(listA, listB, listC)
%time
listA = list(range(1000000000))
listB = list(range(1000000000))
listC = []
for i in range(len(listA)):
    listC.append(listA[i]*listB[i])

#print(listA, listB, listC)
# 2차원 배열 계산
%time
size = 100
listA = list(range(size))
listB = list(range(size))
listC = []
for i in range(len(listA)):
    for j in range(len(listA)):
        listC.append(listA[i]*listB[j])

#print(listC)<jupyter_output>CPU times: user 3 µs, sys: 0 ns, total: 3 µs
Wall time: 6.91 µs<jupyter_text>수행속도 비교<jupyter_code># 3차원 배열 계산
import time

size = 10000
listA = list(range(size))
listB = list(range(size))
start = time.time()

for i in range(len(listA)):
    for j in range(len(listA)):
            (listA[i]*listB[j])

print('time:', time.time() - start)
# Numpy를 활용하여 행렬 계산

import numpy as np
import time

size = 1000000
listA = list(range(size))
listB = list(range(size))
start = time.time()
for i in range(len(listA)):
    for j in range(len(listB)):
        (listA[i]*listB[j])
print('time:', time.time() - start)
# Numpy를 활용하여 행렬 계산

import numpy as np
import time

size = 1000000
listA = list(range(size))
listB = list(range(size))
start = time.time()
np.multiply(listA, listB)
print('time:', time.time() - start)<jupyter_output>time: 0.12282299995422363<jupyter_text>ndarray class- 배열을 이용한 벡터화연산- 배열에는 모두 동일한 자료형만 저장이 가능(★)- 메모리에 연속적으로 저장(★)- 일반적으로 리스트보다 빠른 것으로 간주<jupyter_code># 1-D array 생성하기

import numpy as np

ar = np.array([10,20,30,40,50])
ar
type(ar)
# 2-D array 생성하기

ar = np.array([[1,2,3],[4,5,6],[7,8,9]])
ar
len(ar)
len(ar[0])
# 2-D array 생성하기

ar = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]])
ar
len(ar)
len(ar[0])
# 3-D array 생성하기 (2 * 2 * 3 배열)

ar = np.array([[[1,2,3],[4,5,6]],
               [[7,8,9],[10,11,12]]])
ar
np.shape(ar)
np.ndim(ar)
# 배열 생성 실습
ar = np.array([10, 8, 15, 7, 19])
ar
ar = np.array([[10,20,30],[40,50,60],[70,80,90]])
ar
ar = np.array([[[100,90,80],[70,60,50]],[[15,25,35],[45,55,65]],[[11,22,33],[44,55,66]]])
ar
len(ar)
np.ndim(ar)
np.shape(ar)<jupyter_output><empty_output><jupyter_text>다음 크기의 임의의 정소 배열을 생성하시오- (2,5,4), (3,3,3), (5,5,2), (7,1,4), (3,3,9), (6,2,5)<jupyter_code>ar = np.array([[[1,2,3,4,5],[3,4,5,6,7]],[[4,5,6,7,8],[6,7,8,9,10]],[[7,8,9,10,11,12],[9,10,11,12,13]],[[11,12,13,14,15],[13,14,15,16,17]]])
ar
np.shape(ar)<jupyter_output><empty_output><jupyter_text>배열 처리- np.ones (배열을 1로 채움)- np.zeros (배열을 0으로 채움)<jupyter_code>np.ones((2,3,4))
np.zeros((3,3,5))<jupyter_output><empty_output><jupyter_text>배열 생성하기<jupyter_code>np.arange(100,110)
# arange의 개수와 reshape의 개수가 같아야 한다
np.arange(100,110).reshape(2,5)
np.random.random((2,5,3))
# 배열 생성 연습
np.arange(10,25).reshape(3,5)
np.arange(11,61).reshape(2,5,5)
np.arange(74,250,5).reshape(3,3,4)<jupyter_output><empty_output><jupyter_text>Transpose- 행과 열을 교체- ar.T<jupyter_code>np.arange(10).reshape(2,5)
np.arange(10).reshape(2,5).T
ar = np.arange(10,100).reshape(9,10)
ar
ar.reshape(3,3,10)<jupyter_output><empty_output><jupyter_text>Slicing(슬라이싱)- 1차원 배열: 리스트와 동일- N차원 배열: ‘,’ 로 구별하여 연결<jupyter_code>ar = np.arange(0,15).reshape(3,5)
ar
ar[1:,1:]
ar[:2,:1]
ar[1:2,3:]
ar = np.arange(0,24).reshape(3,2,4)
ar
ar[1:,:1]
ar[1:, 0:, :3]
ar[1:3, 1:4, 1:5]
# 1-20으로 구성된 (4,5) 행렬에서 [6,7,8]가 남도록 슬라이싱 하시오.
ar = np.arange(1,21).reshape(4,5)
ar
ar[1:2,:3]
# 1-30으로 구성된 (2,5,3) 행렬에서 [16,17],[19,20]이 남도록 슬라이싱 하시오.
ar = np.arange(1,31).reshape(2,5,3)
ar
ar[1:,:2,:2]<jupyter_output><empty_output><jupyter_text>Vectorization operation- 배열화 계산- 원소 하나 하나씩 계산하는 것이 아니라 배열 단위로 계산- Loops 없이 연산하여 코딩의 양이 줄어듬- 병렬처리가 가능 (multi-core)<jupyter_code>x = np.arange(10,13)
x
y = np.arange(0,3)
y
x + y
x * y
x - y
x / y<jupyter_output>/Users/richard/anaconda3/lib/python3.7/site-packages/ipykernel_launcher.py:1: RuntimeWarning: divide by zero encountered in true_divide
  """Entry point for launching an IPython kernel.<jupyter_text>배열 Vectorized 연산 실습1. [7,5,9,10]과 [4,10,6,2] 인 2개의 배열을 생성    - 각 배열의 값을 3배로 만든 다음 더한 결과를 출력하시오2. [[7,5,9,10],[4, 10, 6, 2]]과 [[1, 3, 4, 9],[14, 7, 6, 4]]인 2개의배열을 생성    - 앞의 배열에서 뒤의 배열을 뺀 뒤 각 값이 양수인지 아닌지를 True, False로 출력하시오.<jupyter_code>x = np.array([7,5,9,10])
y = np.array([4,10,6,2])

x * 3 + y * 3
x = np.array([[[7,5,9,10],[4, 10, 6, 2]]])
y = np.array([[[1, 3, 4, 9],[14, 7, 6, 4]]])
(x - y) > 0<jupyter_output><empty_output><jupyter_text>브로드캐스팅(broadcasting)- 행렬끼리 연산(덧셈,뺄셈)할 때 크기가 다른 경우 이를 알아서 확대 해주는 기능- 특별히 작업해줄 것은 없음<jupyter_code>ar = np.arange(1,11).reshape(2,5)
ar
# 행열에 Scalar 값을 더하면 알아서 크기에 맞는 행렬(2x5)에 5로 채워서 계산 함
ar = ar + 5
ar<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.21075228672764607, 'fraction_numerical': 0.10061601642710473, 'mean_word_length': 5.378571428571429, 'pattern_counts': {'":': 0, '<': 42, '<?xml version=': 0, '>': 43, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 4, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '11', 'dir': 'jupyter-structured-clean-dedup', 'id': '360301', 'license': 'MIT', 'n_tokens_mistral': 3239, 'n_tokens_neox': 3270, 'n_words': 522, 'path': 'Day11_Numpy1.ipynb', 'repo_name': 'THE-R4U/AI_Innovation', 'size': '5357'}