본문 바로가기
First step/AI 기초반

[TIL]21.06.30 numpy1

by Joshua21 2021. 6. 30.


# 주피터의 사용법과 numpy 사용하기

import numpy as np
ar = np.array([0,1,2,3,4,5,6,7,8,9])
print(ar)
ar

mylist=[0,1,2,3,4,5,6,7,8,9]
ar1 = np.array(mylist)
print(ar1)
ar1

print(type(mylist))
print(type(ar))


data=[0,1,2,3,4,5,6,7,8,9]
data1=list(range(10))


answer=[]
for i in data:
    answer.append(2*i)
print(answer)


# 백터화 연산을 사용하면 for반복문 없이 한번의 연산으로 계산할수 있음

x=np.array(data)
x
x*2


# 벡터화 연산은 비교연산과 논리연산을 포함한 모든 종류의 수학연산에 대해 적용된다.

a=np.array([1,2,3])
b=np.array([10,20,30])


#numpy array의 벡터화 연산
2*a+b



#리스트의 연산과 비교 해보기
lista=[1,2,3]
listb=[10,20,30]
2*lista+listb


print(a)
a==2
#a == np.array([2,2,2]) 인가?



b>10

(a==2)&(b>10)#and 논리연산


(a==2)|(b>10)#or논리연산


# 2차원 배열 만들기
# ndarray는 n차원 배열의 구조를 지원한다

c= np.array([[0,1,2],[3,4,5]]) # 2x3 array
print(c)
c



#2차원 요소의 갯수
len(c)



#1파원 요소의 갯수
print(c[0])
len(c[0])

k=np.array([[10,20,30,40],[50,60,70,80]])
k

j=np.array([[1,2,3,4],[5,6,7,8]])
i=j*10
i
d=np.array([[[1,2,3,4,],[5,6,7,8],[9,10,11,12]],
            [[11,12,13,14],[15,16,17,18],[19,20,21,22]]])
print(d)

d1=[[1,2,3,4,],[5,6,7,8],[9,10,11,12]]
d2=[[11,12,13,14],[15,16,17,18],[19,20,21,22]]
d=np.array([d1,d2])
print(d)

#각 차원의 크기를 구함
len(d),len(d[1]),len(d[0][0])


# ndim속성은 배열의 차원, shape속성은 배열의 크기를 반환한다

print(a.ndim)
print(a.shape)


print(c.ndim)
print(c.shape)

print(d)
print(d.ndim)
print(d.shape)
type(d)

print(a)
print(a[1])
print(a[-1])

print(d)
print(d[0][1])
print(d[-1][-1])
print(d[-1][-1][-1])
      


# 배열 객체로 구현한 다차원 배열의 슬라이싱


t=np.array([[0,1,2,3],[4,5,6,7]])
t
t[0,:]# 첫번쨰 1차원 전체


t[:,1]#각 1차원의 두번째 요소



t[1,1:] #2번쨰 일차원의 두번째부터 끝까지




t[:2,:2]#처음부터 2번쨰 까지의 2차원 요소 중 처음부터 2번쨰 까지의 1차원 요소


# 연습문제1 7을 인덱싱 한다


m=np.array([[0,1,2,3,4],[5,6,7,8,9],[10,11,12,13,14]])
m

m[1,2]
#14인덱싱하기
m[2,4],m[-1,-1]

#[6,7]인덱싱 하기
m[1,1:3]


#3[3,4],[8,9]슬라이싱하기
m[:2,3:], m[:2,-2:]


# fancy indexing 데이터 베이스에서 요청하면 값을 가져오는것과 같음 

a=np.array([0,1,2,3,4,5])
idx=np.array([True,False,True,False,True,False])
a[idx]

np.array([0,1,2,])[np.array([True,False,True])]


# 조건문 연산 사용하기
print(a)
a%2


a%2==0


a[a%2==0]


# 정수 배열 인덱싱


a=np.array([11,22,33,44,55,66,77,88,99])
idx=np.array([0,2,4,6,8])
a[idx]


z=np.array([11,22,33,44,55,66,77,88,99])
ixd3 = np.array([0,0,0,0,0,1,1,1,1,1,2,2,2,2,2])
z[ixd3]

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



a[:,[True,False,False,True]]



a[[2,0,1],:]#1차원의 순서 바꾸기

r=range(1,21)
x=np.array(r)
x[x%3==0]
print(x)


x[x%4==1]



x[(x%4==1) & (x%3==0)]



import numpy as np
x=np.array([1,2,3])
print(x)
x.dtype



x=np.array([1.0,2.0,3.0])
x.dtype


x=np.array([1,2,3.0])
print(x)
x.dtype



x=np.array([1,2,3],dtype='f')#정수였던 요소를 실수로변경
x.dtype
x


x[0]+x[1]

x=np.array([1,2,3],dtype='U')#실수에서 다시 unicode로 변경
x.dtype
x



x[0]+x[1]#문자열 '1'+'2'


np.array([0,1,-1,0]) / np.array([1,0,0,0]) #inf=무한대 nan=나눌수없다.



np.log(0)#밑수가 e인 로그함수



np.exp(-np.inf)

np.exp(1)


a=np.zeros(5)
a



b=np.zeros((2,3))# 크기를 뜻하는 튜플을 입력하면 다차원 배열도 만들수 있다
b


c=np.zeros((5,2),dtype='i')
c


d=np.zeros(5,dtype='U4')#unicode 4글자 4글자가 넘어가면 짤림
d


d[0]='abc'
d[1]='abcd'
d[2]='ABCDE'
d

e=np.ones((2,3,4),dtype='i8')#0아닌 1로 배열을 생성하려면
e


# #크기를 튜플로 명시하지않고 다른 배열과 같은 크기로 생성하고 싶다면 like사용


f=np.ones_like(e,dtype='f')



f1=np.zeros_like(e)
f1


# 큰 배열을 만들떄는 0,1등을 사용하면 시간도 오래걸리고 오버플로우걸릴수있음
# 따라서 가비지 데이터를 넣어 원하는 크기의 배열을 만듬


g=np.empty((4,3))
g



#%%time은 해당 배열을 만드는데 걸리는 시간 
%%
h=np.empty((10000,10000))




get_ipython().run_cell_magic('time', '', 'm=np.ones((10000,10000))')




get_ipython().run_cell_magic('time', '', 'm=np.zeros((10000,10000))')


np.arange(10)



np.arange(3,21,2)#시작,끝(포함x),단계



np.arange(-10,11,2)



np.arange(7,-9,-3)




np.arange(1.7,11,1.5)


# a와b사이의 c개의 점을 생성 c는 디폴트 50개


np.linspace(0,100,5) #시작, 끝(포함),갯수




np.linspace(0,10,10,endpoint=False)#0~9까지 10제외





np.linspace(0,10,10,endpoint=True)#0,10포함 10개구간으로



np.linspace(0,10,10)





np.linspace(1,50)#갯수


# a~b를 linspace로 같은 간격으로 나누고  


np.logspace(1,4,4)





np.linspace(0.1,1.0,num=10)





10**0.1,10**0.2,10**0.3,10**0.4,10**0.5,




10**np.linspace(0.1,2.0,20) #라인스페이스로 로그스페이스 표현




np.logspace(0.1,2.0,20)




import matplotlib.pyplot as plt
plt.plot(np.linspace(0.1,2.0,20),np.logspace(0.02,2.0,20))


# 전치연산 2차원 배열의 전치연산은 행과 열을 바꾸는 작업 매서드가 아닌 t속성으로 구할슀다.




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



A.T


# 배열의 크기 변형
# reshape은 만들어진 배열의 내부 데이터는 보존한태로 형태만 바꿀때 사용


a=np.arange(12)
a


b=np.arange(12).reshape(3,2,2)
b



print(b.ndim)
print(b.shape)

사용하는 원소의 갯수가 정해저 있기떄문에 명령형태의 튜플 원소중 하나는 -1이라는
숫자로 대체할수있다. -1을 넣으면 해당숫자는 계산되어 사용된다

ar=a.reshape(3,-1)
ar



a.reshape(3,-1).shape

b=a.reshape(2,2,-1)
b


c=a.reshape(2,-1,2)
print(c)
c.shape


# 다차원 배열을 무조건 1차원으로 펼치기 위해서는 flatten 이나  ravel 매서드를 사용한다


print(b)
b.flatten()

b.ravel()


# 배열에서 중요한 점은 (6,1)/ (1,6)은 데이터가 같아도 다른 객체라는점
x=np.arange(6)
x,len(x),x.ndim,x.shape

x1=x.reshape(1,6)
x1,len(x1),x1.ndim,x1.shape
x2=x.reshape(6,1)
x2,len(x2),x2.ndim,x2.shape


x.reshape(6,) == x.reshape(1,6)

x.reshape(6,) is x.reshape(1,6)
x.reshape(2,3) == x.reshape(3,2)

np.arange(11,31).reshape(4,-1)
np.arange(3.3,-8.3,-0.5).reshape(6,-1)


# hstack 행의 수가 같은 2개 이상의 배열을 옆으로 연결할떄 사용

a1=np.ones((2,3))
a1



a2=np.ones((2,2))
a2


np.hstack([a1,a2])


a3=np.arange(10,70,10).reshape(2,3)
a3

np.hstack([a1,a2,a3])


# vstack은 열의 수가 같은 2개이상의 배열을 위아래로 연결

b1=np.ones((2,3))
b1

b2=np.zeros((3,3))
b2

np.vstack([b1,b2])


# column_stack 은 두개이상의 배열을 컬럼 방향으로 세워 좌우로 연결

cs1=np.array([1,2,3])
cs2=np.array([10,20,30])
np.column_stack([cs1,cs2])


# dstack 명령은 제3의 축, 행이나 열이 아닌 깊이 방향으로 배열을 합친다 가장 안쪽 원소의 차원이 증가한다
# 가장 내부의 숫자 원소가 배열이 된다


c1=np.ones(3)
print(c1)
print(c1.shape)


c2=np.zeros(3)
c2


np.dstack([c1,c2])



(np.dstack([c1,c2])).shape



c3=np.ones((3,4))
c3



c4=np.zeros((3,4))
c4


np.dstack([c3,c4])



(np.dstack([c3,c4])).shape



a=np.zeros(3)
b=np.ones(2)
x=np.hstack([a,b])
y=np.arange(10,151,10).reshape(3,-1)
z=np.vstack([x,x,x,y])
print(np.vstack([z,z]))



a=np.zeros((3,3))
b=np.ones((3,2))
y=np.arange(10,151,10).reshape(3,-1)
x=np.hstack([a,b])


# numpy로 csv파일 읽고 쓰기


import numpy as np

a= np.arange(1,101).reshape(20,5)
b=np.arange(201,401,2).reshape(20,5)

np.savetxt('c:/users/cyan9/workspace/file_a.csv',a,fmt='%d',delimiter=',')
np.savetxt('c:/users/cyan9/workspace/file_a.txt',a+b,fmt='%d',delimiter=',')


read_a=np.loadtxt('c:/users/cyan9/workspace/file_a.txt',delimiter=',',skiprows=1,dtype='int')
read_a



read_b=np.loadtxt('c:/users/cyan9/workspace/file_a.csv',delimiter=',',skiprows=1,dtype='int')
read_b