In [2]:
import numpy as np
arr = np.array([[1,2,3],[4,5,6]])
arr
Out[2]:
array([[1, 2, 3],
[4, 5, 6]])
In [6]:
arr+arr #벡터화 element-wise
#요소별로 계산
Out[6]:
array([[ 2, 4, 6],
[ 8, 10, 12]])
In [5]:
arr/arr
Out[5]:
array([[1., 1., 1.],
[1., 1., 1.]])
In [8]:
lst = [[1,2,3],[4,5,6]]
lst+lst #리스트는 안됨
Out[8]:
[[1, 2, 3], [4, 5, 6], [1, 2, 3], [4, 5, 6]]
In [11]:
lit = [[1,2,3],[4,5,6]]
lit2 = lit
result = []
for i in range(len(lit)):
temp = []
for j in range(len(lit[i])):
temp.append(lit[i][j]+lit2[i][j])
result.append(temp)
print(result)
[[2, 4, 6], [8, 10, 12]]
In [13]:
arr2 = np.array([100,200,300])
arr+arr2
#shape이 맞아야 함
Out[13]:
array([[101, 202, 303],
[104, 205, 306]])
In [15]:
arr3 = np.array([[100],[200]])
arr+arr3
Out[15]:
array([[101, 102, 103],
[204, 205, 206]])
In [16]:
arr4 = np.array([100,200,300,400])
arr+arr4
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
Cell In[16], line 2
1 arr4 = np.array([100,200,300,400])
----> 2 arr+arr4
ValueError: operands could not be broadcast together with shapes (2,3) (4,)
In [17]:
my_list = np.array([[[1,2,3],[4,5,6],[7,8,9]]])
my_list
Out[17]:
array([[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]])
In [18]:
print('차원 : ', my_list.ndim)
print('모양 : ', my_list.shape)
print('크기 : ', my_list.size)
print('데이터 타입 : ', my_list.dtype)
print('각 원소의 크기 : ', my_list.itemsize) #각 배열의 요소의 크기를 바이트 단위로 변환
#int64는 8바이트 정수
차원 : 3
모양 : (1, 3, 3)
크기 : 9
데이터 타입 : int32
각 원소의 크기 : 4
In [19]:
#array함수: 기존에 있던 데이터(자료형)을 이용하여 새로운 배열을 생성
np.array(range(20))
Out[19]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
In [20]:
np.zeros(5) #모델 초기화나 임시 데이터 생성 등에 유용하게 쓰임
Out[20]:
array([0., 0., 0., 0., 0.])
In [21]:
np.zeros((2,4),dtype=np.int8)
Out[21]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]], dtype=int8)
In [25]:
np.ones((3,3)) #괄호 하나 더 닫아줘야 한다. #다중인덱스
Out[25]:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
In [23]:
np.full((4),5)
Out[23]:
array([5, 5, 5, 5])
In [27]:
arr1 = np.array([[1,2,3,1],[2,4,5,6,]])
arr1
#shape를 명시하지 않고 기존에 존재하는 배열을 인자로 넘겨줌
Out[27]:
array([[1, 2, 3, 1],
[2, 4, 5, 6]])
In [28]:
arr2 = np.ones_like(arr1)
arr2
Out[28]:
array([[1, 1, 1, 1],
[1, 1, 1, 1]])
In [29]:
arr3 = np.zeros_like(arr1)
arr3
Out[29]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])
In [31]:
arr4 = np.arange(5)
np.arange(-3,3)
np.arange(3,50,5)
#arange: 파이썬 내장함수 range와 유사한 역할, ndarray를 반환
Out[31]:
array([ 3, 8, 13, 18, 23, 28, 33, 38, 43, 48])
In [33]:
np.linspace(0,1,6)
Out[33]:
array([0. , 0.2, 0.4, 0.6, 0.8, 1. ])
In [34]:
a = np.array([1,2,3])
b = np.array([4,5,6])
np.hstack([a,b])
Out[34]:
array([1, 2, 3, 4, 5, 6])
In [35]:
np.concatenate((a,b),axis=0)
Out[35]:
array([1, 2, 3, 4, 5, 6])
In [36]:
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.hstack([a,b])
Out[36]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
In [37]:
np.concatenate((a,b),axis=0)
Out[37]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
In [40]:
np.vstack([a,b])
Out[40]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
In [41]:
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.vstack([a,b])
Out[41]:
array([[1, 2],
[3, 4],
[5, 6],
[7, 8]])
In [42]:
a = np.array([1,2,3])
b = np.array([4,5,6])
np.vstack([a,b])
Out[42]:
array([[1, 2, 3],
[4, 5, 6]])
In [44]:
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
np.concatenate((a,b),axis=1)
#vstack은 행과 열을 중시하고 concatenate는 구조를 중시
Out[44]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
In [47]:
np.column_stack([a,b])
#데이터를 어떻게 붙이느냐에 따라 분석이 달라진다
Out[47]:
array([[1, 2, 5, 6],
[3, 4, 7, 8]])
In [48]:
import random
random.random()
Out[48]:
0.6358563020153478
In [49]:
random.uniform(100,200) #괄호 안 두 수 사이의 실수 중에서 난수값을 리턴
Out[49]:
121.40660736042898
In [50]:
data = [1,2,3,4,5,6]
random.choice(data)
Out[50]:
4
In [51]:
data = ['aaple', 'banana', 'grape', 'orange']
random.choice(data)
Out[51]:
'orange'
In [53]:
#랜덤한 값을 유지하고 싶다면 (재현가능성, reproducibility)seed 번호를 지정해줌
random.seed(42)
In [54]:
import numpy as np
#rand: 0과 1사이 균일 분포에서 난수 생성
print('Random number between 0 and 1', np.random.rand())
Random number between 0 and 1 0.5434049417909654
In [56]:
#randn: 표준 정규분포(중심이 0, 표준편차 1)에서 난수 생성
print('Random number from standard normal distribution', np.random.randn())
Random number from standard normal distribution -0.5616387568230068
In [58]:
#radint: 주어진 번위에서 임의의 정수 생성.
np.random.randint(1,10)
Out[58]:
1
In [60]:
#random: 0과 1사이의 균일 분포에서 난수 생성(rand)와 비슷하지만 다른 형태의 인자를 받음
np.random.random()
Out[60]:
0.14860484007536512
In [62]:
#랜덤 샘플링: 주어진 집합에서 임의로 선택하는 과정
arr = np.array([1,2,3,4,5])
np.random.choice(arr)
Out[62]:
5
In [64]:
#shuffle
np.random.shuffle(arr)
arr
Out[64]:
array([2, 3, 4, 1, 5])
In [66]:
#permutation: 배열의 무작위 순열을 반환(원래 배열을 바꾸지 않음)
np.random.permutation(arr)
Out[66]:
array([3, 4, 2, 1, 5])
In [78]:
###로또 생성기###
import random
import numpy as np
def make_lotto(count):
for i in range(count):
numbers = list(range(1,46))
random.shuffle(numbers)
lotto_num = numbers[:6]
lotto_num.sort()
print(f'{i+1}.로또번호 : {lotto_num}')
count = int(input(print('로또 번호를 몇 개 생성할까요?> ')))
make_lotto(count)
로또 번호를 몇 개 생성할까요?>
1.로또번호 : [1, 2, 14, 23, 32, 43]
2.로또번호 : [6, 10, 17, 22, 25, 27]
3.로또번호 : [3, 9, 13, 15, 40, 45]
4.로또번호 : [6, 10, 16, 41, 42, 45]
In [80]:
import numpy as np
def lotto_maker2(count):
for i in range(count):
# 1부터 45까지의 숫자 중에서 6개를 중복 없이 선택
lotto_num = np.random.choice(range(1, 46), size=6, replace=False)
# 번호를 오름차순으로 정렬
lotto_num = sorted(lotto_num)
print(f'{i+1}번째 로또번호: {lotto_num}')
try:
count = int(input('로또 번호를 몇 개 생성할까요? > '))
lotto_maker2(count)
except ValueError:
print('숫자를 입력해주세요.')
1번째 로또번호: [9, 10, 16, 22, 32, 45]
2번째 로또번호: [11, 18, 32, 35, 39, 44]
3번째 로또번호: [1, 2, 6, 14, 29, 45]
4번째 로또번호: [6, 18, 24, 31, 39, 41]
In [81]:
arr = np.zeros((3,2))
arr.flatten()
Out[81]:
array([0., 0., 0., 0., 0., 0.])
In [83]:
arr = np.arange(12)
arr.reshape(3,4)
Out[83]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
In [85]:
arr = np.arange(20)
arr
Out[85]:
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19])
In [87]:
arr.reshape(-1,10)
Out[87]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
In [88]:
arr.reshape(5,-1)
Out[88]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
In [90]:
arr = np.arange(20).reshape(4,5)
arr
Out[90]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [91]:
arr.transpose()
Out[91]:
array([[ 0, 5, 10, 15],
[ 1, 6, 11, 16],
[ 2, 7, 12, 17],
[ 3, 8, 13, 18],
[ 4, 9, 14, 19]])
In [92]:
arr.transpose().shape
Out[92]:
(5, 4)
In [93]:
arr2 = np.arange(30).reshape(3,2,5)
arr2
Out[93]:
array([[[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9]],
[[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]],
[[20, 21, 22, 23, 24],
[25, 26, 27, 28, 29]]])
In [94]:
arr2.transpose().shape
Out[94]:
(5, 2, 3)
In [97]:
a = np.arange(3).reshape(1,3)
y = np.swapaxes(a,0,1) #축을 건드림
y.shape
Out[97]:
(3, 1)
In [99]:
import numpy as np
a = np.arange(3).reshape(1,3) #(1*3) 2D array
y = np.swapaxes(a,0,1) #0은 가장 높은 차수의 축, 2차원 / 1은 그 다음 높으 ㄴ차수의 축 1차원. 즉, 원소의 행과 열을 바꾸라는 것
In [100]:
import numpy as np
Arr = np.arange(0,21)
arr1 = Arr[Arr%2==0]
arr2 = Arr[Arr%2!=0]
In [101]:
lst = list(range(6))
lst
Out[101]:
[0, 1, 2, 3, 4, 5]
In [102]:
lst[2:5] = =1
Cell In[102], line 1
lst[2:5] = =1
^
SyntaxError: invalid syntax
In [103]:
lst[3] = -1
lst
Out[103]:
[0, 1, 2, -1, 4, 5]
In [104]:
arr1d = np.arange(8)
arr1d
Out[104]:
array([0, 1, 2, 3, 4, 5, 6, 7])
In [106]:
arr1d[3:6] = 100
arr1d
Out[106]:
array([ 0, 1, 2, 100, 100, 100, 6, 7])
In [107]:
#slicing
arr_part = arr1d[:3]
arr_part
Out[107]:
array([0, 1, 2])
In [109]:
#change the value
arr_part[1:] = -1
arr_part
Out[109]:
array([ 0, -1, -1])
In [110]:
#the original data is changed
arr1d
Out[110]:
array([ 0, -1, -1, 100, 100, 100, 6, 7])
In [112]:
##list
#slicing
lst_part = lst[2:]
lst_part
Out[112]:
[2, -1, 4, 5]
In [113]:
lst_part[3] = 100
lst_part
Out[113]:
[2, -1, 4, 100]
In [115]:
lst #원본데이터 유지
Out[115]:
[0, 1, 2, -1, 4, 5]
In [116]:
arr2d = np.arange(20).reshape(4,-1)
arr2d
Out[116]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [118]:
arr2d[0] #다중리스트의 인덱싱과 유사
Out[118]:
array([0, 1, 2, 3, 4])
In [119]:
arr2d[1][2] #재귀적으로 접근
Out[119]:
7
In [120]:
arr2d[1,2] #콤마(,)를 이용하여 쉽게 인덱싱
Out[120]:
7
In [121]:
arr2d[:3][:2] #재귀적 슬라이싱
Out[121]:
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
In [122]:
arr2d[:3, :2]
Out[122]:
array([[ 0, 1],
[ 5, 6],
[10, 11]])
In [123]:
arr2d = np.arange(20).reshape(4,5)
arr2d
Out[123]:
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])
In [126]:
arr2d[[0,1],[4]]
Out[126]:
array([4, 9])
In [128]:
arr2d[[0,1],[4,4]]
Out[128]:
array([4, 9])
In [129]:
arr2d[[0,1,2],[4,3,1]]
Out[129]:
array([ 4, 8, 11])
In [130]:
arr1 = np.arange(8).reshape(2,-1)
arr2 = np.arange(-40,40,10).reshape(2,-1)
print(arr1)
print(arr2)
[[0 1 2 3]
[4 5 6 7]]
[[-40 -30 -20 -10]
[ 0 10 20 30]]
In [131]:
np.maximum(arr1, arr2)
Out[131]:
array([[ 0, 1, 2, 3],
[ 4, 10, 20, 30]])
In [132]:
np.subtract(arr2, arr1)
Out[132]:
array([[-40, -31, -22, -13],
[ -4, 5, 14, 23]])
In [133]:
np.multiply(arr1, arr2)
Out[133]:
array([[ 0, -30, -40, -30],
[ 0, 50, 120, 210]])
In [135]:
arr = np.random.randn(200,500)
arr.shape
Out[135]:
(200, 500)
In [136]:
arr.sum()
Out[136]:
-443.0168887109012
In [137]:
np.sum(arr)
Out[137]:
-443.0168887109012
In [138]:
arr.shape
Out[138]:
(200, 500)
In [140]:
arr.mean()
Out[140]:
-0.004430168887109012
In [141]:
arr.mean(axis=0).shape
Out[141]:
(500,)
In [142]:
arr.mean(axis=1).shape
Out[142]:
(200,)
In [143]:
np.var(x) #분산
Out[143]:
0.0
In [144]:
np.std(x) #표준 편차
Out[144]:
0.0
In [145]:
import numpy as np
np.random.rand()
Out[145]:
0.6111527188779093
In [146]:
np.random.rand(1)
Out[146]:
array([0.3908295])
In [147]:
np.random.rand(2)
Out[147]:
array([0.04538567, 0.79106915])
In [148]:
np.random.rand(3,3)
Out[148]:
array([[0.70159633, 0.3184233 , 0.85678588],
[0.79296583, 0.18620243, 0.36900296],
[0.54971065, 0.04235587, 0.47006058]])
In [149]:
np.random.rand(5,2)
Out[149]:
array([[0.62438832, 0.96242869],
[0.49194522, 0.03492336],
[0.32886565, 0.7157502 ],
[0.14526741, 0.73290047],
[0.15993213, 0.82335819]])
In [150]:
#any: 하나 이상의 값이 True면 True를 반환
#all: 모든 값이 True이면 True를 반환
#where: x if 조건 else y의 벡터화 버전
#numpy를 사용하여 큰 배열을 빠르게 처리할 수 있으며, 다차원도 간결하게 표현이 가능
#np.where(조건, x, y)
xarr = np.array([100,200,300,400])
yarr = np.array([1,2,3,4])
cond = np.array([True, False, True, False])
In [151]:
result = np.where(cond, xarr, yarr)
result
Out[151]:
array([100, 2, 300, 4])
In [152]:
np.where(xarr>200, max(xarr), 0)
Out[152]:
array([ 0, 0, 400, 400])
In [153]:
np.where(xarr%3==0, 1, 0)
Out[153]:
array([0, 0, 1, 0])
In [155]:
#arr.sort() 주어진 축에 따라 정렬
#arr자체를 정렬함 (in-place)
np.random.seed(10)
arr = np.random.randint(1, 100, size=10)
arr
Out[155]:
array([10, 16, 65, 29, 90, 94, 30, 9, 74, 1])
In [156]:
arr.sort()
arr
Out[156]:
array([ 1, 9, 10, 16, 29, 30, 65, 74, 90, 94])
In [159]:
#np.sort()는 배열을 직접 변경하지 않고 정렬된 결과를 가진 복사본을 반환
np.random.seed(20)
arr = np.random.randint(1,100,size=10)
np.sort(arr)
Out[159]:
array([10, 16, 21, 23, 29, 72, 76, 91, 91, 96])
In [160]:
arr
Out[160]:
array([91, 16, 96, 29, 91, 10, 21, 76, 23, 72])
In [161]:
-np.sort(-arr) #부호를 이용하여 내림차순으로 정렬
Out[161]:
array([96, 91, 91, 76, 72, 29, 23, 21, 16, 10])