#정리
#numpy - 넘파이 분석 툴
#pip3 install pandas
- 파이썬 안에서 인스톨하는 명령어 >> pip3 install
#numpy version check
- print("numpy version",np.__version__) >> numpy ver. 1.21.5
#리스트 배열(1차원적인 데이터)을 사용할 때 생길 수 있는 불편함을 해결하기 위해 생긴 라이브러리이다.
- 딕셔너리(2차원적(키-밸류)인 데이터)를 쉽게 다룰 수 있게 해주는 툴이 pandas이다.
#01ndarray - 넘파이 배열
#import numpy as np
#numpyArray Fn : 가급적 같은 타입의 원소만으로 구성하는 것이 좋다.
- ndarray = np.array([1000,2,128]) #기본적인 생성 방법
- print(ndarray.dtype) #int32,U3(unicode),... >> 속성으로 타입을 확인할 수 있다.
#배열 생성 시, 옵션을 이용해 일괄적으로 원소 타입을 캐스팅(실수>>정수)할 수 있다.
- ndarray = np.array([1.1,2.2,3.3],dtype=np.int32) #[1.1,2.2,3.3] >> [1,2,3]
- ndarray = np.array([1.1,2.2,3]) #실수 사이에 정수가 들어간 경우, 정수는 "n."로 표기된다.
#bool/str/복소수타입 배열 생성도 가능하다.
- ndarray = np.array([True,False,False])
- ndarray = np.array(["kim","lee","chang"])- ndarray = np.array(["1+1j","2+2j","3+3j"]) #복소수(complex) : 실수 + 허수
#broadcasting 특성을 가지기 때문에, 데이터의 변경이 편리하다.- ndarray = np.array([11,22,33]) + 10 #단순히 +10만으로 모든 원소에 영향을 줄 수 있다.
- ndarray = np.array([[11,22,33],[11,22,33]]) * 10 #2차원 배열도 가능
- ndarray = np.array([[11,22,33],[11,22,33]]) * np.array([[10],[100]]) #배열 값으로도 가능
- ndarray = np.array([[11,22,33],[11,22,33],[11,22,33]]) * np.array([[10],[100],[1000]]) #배열 값으로도 가능** 넘파이배열은 다차원배열도 연속된 메모리에 나열된다.
#02dimention_strides - 행렬 정보 확인
#dimension : 넓이, 크기 = 몇행 몇열.. / strides : 보폭(데이터 크기)
<ndarray = [[11,22,33],[44,55,66]] >
- print(ndarray,len(ndarray)) #2 : 길이(원소) 2개
- print(ndarray, ndarray.size) #6 : 데이터 수(최종 원소) 6개
- print(ndarray, ndarray.shape) #(2,3) : 배열 형태(2행 3열) - tuple형태로 표현
- print(ndarray, ndarray.strides) #(12,4) : 행간, 데이터간 사이즈 표현(원소(4*3)크기와 최종원소(4byte-int)의 크기)
<ndarray = ["aa","bb","cc","dd","ee","ff"]>
- print(ndarray, ndarray.shape) #(6,) : 6행 1열
- print(ndarray, ndarray.strides) #(8,) : 문자열 8byte로 본다.#03nptranspose - 행렬 전치
#전치 : 행렬 변경 (2,3) >> (3,2) 를 하게되면 나타나는 변화
- 원본에 영향을 안주기 때문에 원본에 재할당 해야한다.
- 일렬로 된 데이터는 동일하게 사용되며, 데이터 값을 찾는 거리만 달라지므로, strides의 보폭이 대치된다.** 메모리에는 [11,22,33,44,55,66] 으로 저장되어있음(상세 설명은 더보기).
#전치하는 방법 4가지
- ndarray = ndarray.transpose() #배열 객체 내에서 전치함수 콜
- ndarray = np.transpose(datas or ndarray) #라이브러리 내에서 전치함수 콜
- ndarray = ndarray.swapaxes(0,1) #swapaxes()활용
- ndarray = np.array(data).T #.T로도 가능
#전치를 통해 행렬 모양을 맞추면 행렬곱이 가능해진다.
- ndarray = np.array([[11,22,33],[11,22,33]]).T * np.array([[10],[100],[1000]]) #(2,3) >> (3,2)
- ndarray = np.array([[11,22,33],[11,22,33]]).T * np.array([[10,100,1000]]).T #(1,3) >> (3,1)#04append_concatenate - 배열 병합
#기존의 배열 병합 방법
- print(datas1 + datas2) #행으로 더할 때- for i in range(len(datas_sum)): #열로 더할 때
>> datas_sum[i].append(datas3[0][i])
>>print(datas_sum)#ndarray type으로 배열을 병합 할 때는 병합할 배열의 차원이 같아야 한다.
<np.append(넣을 대상,추가 내용,axis=0,1)>- ndarray = np.append(datas1,datas2,axis=0) #list
- ndarray = np.append(np.array(datas1),np.array(datas2),axis=0) #ndarray
- ndarray = np.append(ndarray,np.array(datas3).T,axis=1) #ndarray
<np.concatenate((넣을 대상,추가 내용),axis=0,1)>
- ndarray = np.concatenate((datas1,datas2),axis=0) #list
- ndarray = np.concatenate((np.array(datas1),np.array(datas2)),axis=0) #ndarray
- ndarray = np.concatenate((ndarray,np.array(datas3).T),axis=1) #ndarray
#numpy - 넘파이 분석 툴
#pip3 install pandas
- 파이썬 안에서 인스톨하는 명령어 >> pip3 install
#numpy version check
- print("numpy version",np.__version__) >> numpy ver. 1.21.5
#리스트 배열(1차원적인 데이터)을 사용할 때 생길 수 있는 불편함을 해결하기 위해 생긴 라이브러리이다.
- 딕셔너리(2차원적(키-밸류)인 데이터)를 쉽게 다룰 수 있게 해주는 툴이 pandas이다.
#01ndarray - 넘파이 배열
#import numpy as np
#numpyArray Fn : 가급적 같은 타입의 원소만으로 구성하는 것이 좋다.
- ndarray = np.array([1000,2,128]) #기본적인 생성 방법
- print(ndarray.dtype) #int32,U3(unicode),... >> 속성으로 타입을 확인할 수 있다.
#배열 생성 시, 옵션을 이용해 일괄적으로 원소 타입을 캐스팅(실수>>정수)할 수 있다.
- ndarray = np.array([1.1,2.2,3.3],dtype=np.int32) #[1.1,2.2,3.3] >> [1,2,3]
- ndarray = np.array([1.1,2.2,3]) #실수 사이에 정수가 들어간 경우, 정수는 "n."로 표기된다.
#bool/str/복소수타입 배열 생성도 가능하다.
- ndarray = np.array([True,False,False])
- ndarray = np.array(["kim","lee","chang"])
- ndarray = np.array(["1+1j","2+2j","3+3j"]) #복소수(complex) : 실수 + 허수
#broadcasting 특성을 가지기 때문에, 데이터의 변경이 편리하다.
- ndarray = np.array([11,22,33]) + 10 #단순히 +10만으로 모든 원소에 영향을 줄 수 있다.
- ndarray = np.array([[11,22,33],[11,22,33]]) * 10 #2차원 배열도 가능
- ndarray = np.array([[11,22,33],[11,22,33]]) * np.array([[10],[100]]) #배열 값으로도 가능
- ndarray = np.array([[11,22,33],[11,22,33],[11,22,33]]) * np.array([[10],[100],[1000]]) #배열 값으로도 가능
--예문 코드 보기--
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
print("numpy version",np.__version__) #numpy version check
print("---------------")
#array Fn >> ,가 안들어 있다.
#가급적 같은 타입의 원소만으로 구성하는 것이 좋다.
#ndarray = np.array([1000,2,128],dtype=np.int8) #타입을 미리 지정할 수 있다.
ndarray = np.array([1000,2,128]) #타입을 미리 지정할 수 있다.
print("nomalarray:",[1,2,3])
print(type([1,2,3]))
print("ndarray:",ndarray)
print(type(ndarray))
print(ndarray.dtype) #int32,U3(unicode),... >> 속성으로 타입을 확인할 수 있다.
print("---------------")
ndarray = np.array([1.1,2.2,3.3])
print("ndarray:",ndarray)
print(ndarray.dtype) #float64
print("---------------")
#옵션을 이용해 일괄적으로 원소 타입을 변경(실수>>정수)할 수 있다.
ndarray = np.array([1.1,2.2,3.3],dtype=np.int32)
print("ndarray:",ndarray)
print(ndarray.dtype) #int32
print("---------------")
#실수 사이에 정수가 들어간 경우, 정수는 "n."로 표기된다.
ndarray = np.array([1.1,2.2,3])
print("ndarray:",ndarray)
print(ndarray.dtype)
print("---------------")
#bool타입 배열 생성도 가능하다.
ndarray = np.array([True,False,False])
print("ndarray:",ndarray)
print(ndarray.dtype) #bool
print("---------------")
ndarray = np.array(["kim","lee","chang"])
print("ndarray:",ndarray)
print(ndarray.dtype) #unicode
print("-- 복소수(complex) : 실수 + 허수 --")
ndarray = np.array(["1+1j","2+2j","3+3j"])
print("ndarray:",ndarray)
print(ndarray.dtype) #unicode
print("-- ndarray의 장점 : broadcasting 특성----")
# 데이터의 변경이 편리하다
lst = [11,22,33]
#모든 데이터에 10 증가 시키기 >> print([i+10 for i in lst])
#broadcasting 능력 : 단순히 +10만으로 모든 원소에 영향을 줄 수 있다.
ndarray = np.array([11,22,33]) + 10
print(ndarray)
print("---------------")
ndarray = np.array([11,22,33]) * 10
print(ndarray)
print("---------------")
ndarray = np.array([[11,22,33],[11,22,33]]) * 10 #2차원 배열도 가능
print(ndarray)
print("---------------")
ndarray = np.array([[11,22,33],[11,22,33]]) * np.array([[10],[100]]) #배열 값으로도 가능
print(ndarray)
print("---------------")
ndarray = np.array([[11,22,33],[11,22,33],[11,22,33]]) * np.array([[10],[100],[1000]]) #배열 값으로도 가능
print(ndarray)
** 넘파이배열은 다차원배열도 연속된 메모리에 나열된다.
#02dimention_strides - 행렬 정보 확인
#dimension : 넓이, 크기 = 몇행 몇열.. / strides : 보폭(데이터 크기)
<ndarray = [[11,22,33],[44,55,66]] >
- print(ndarray,len(ndarray)) #2 : 길이(원소) 2개
- print(ndarray, ndarray.size) #6 : 데이터 수(최종 원소) 6개
- print(ndarray, ndarray.shape) #(2,3) : 배열 형태(2행 3열) - tuple형태로 표현
- print(ndarray, ndarray.strides) #(12,4) : 행간, 데이터간 사이즈 표현(원소(4*3)크기와 최종원소(4byte-int)의 크기)
<ndarray = ["aa","bb","cc","dd","ee","ff"]>
- print(ndarray, ndarray.shape) #(6,) : 6행 1열
- print(ndarray, ndarray.strides) #(8,) : 문자열 8byte로 본다.
--예문 코드 보기--
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
print("numpy version",np.__version__) #numpy version check
print("---------------")
#dimension : 넓이, 크기 = 몇행 몇열..
#strides : 보폭(데이터 크기)
#넘파이배열은 다차원배열도 연속된 메모리에 나열된다.
data = [11,22,33,44,55,66]
datas = [[11,22,33],[44,55,66]]
print("list: ",len(data),len(datas))
print("---------------")
ndarray = np.array(data)
#ndarray = np.array(data,dtype=np.int8)#strides 값이 4(32bit)>>1(8bit)로 변경됨
print(ndarray,len(ndarray))
print(ndarray, ndarray.size)
print(ndarray, ndarray.shape)
print(ndarray, ndarray.strides)
print("---------------")
ndarray = np.array(datas)
print(ndarray,len(ndarray)) #2 : 길이(원소) 2개
print(ndarray, ndarray.size) #6 : 데이터 수(최종 원소) 6개
print(ndarray, ndarray.shape) #(2,3) : 배열 형태(2행 3열)
print(ndarray, ndarray.strides) #(12,4) : 원소(4*3)크기와 최종원소(4byte-int)의 크기
print("---------------")
data = ["aa","bb","cc","dd","ee","ff"]
ndarray = np.array(data)
print(ndarray, ndarray.shape) #(6,) : 6행 1열
print(ndarray, ndarray.strides) #(8,) : 문자열 8byte로 본다.
print("---------------")
datas = [["aa","bb","cc"],["dd","ee","ff"]]
ndarray = np.array(datas)
print(ndarray, ndarray.shape) #(2,3) : 2행 3열
print(ndarray, ndarray.strides) #(24,8)
#03nptranspose - 행렬 전치
#전치 : 행렬 변경 (2,3) >> (3,2) 를 하게되면 나타나는 변화
- 원본에 영향을 안주기 때문에 원본에 재할당 해야한다.
- 일렬로 된 데이터는 동일하게 사용되며, 데이터 값을 찾는 거리만 달라지므로, strides의 보폭이 대치된다.
** 메모리에는 [11,22,33,44,55,66] 으로 저장되어있음(상세 설명은 더보기).
datas = [[11,22,33],[44,55,66]]
ndarray = np.array(datas) #[[11,22,33],[44,55,66]]
print(ndarray,ndarray.strides) #(12,4)
# int는 4byte단위 이므로, (2,3)행렬의 경우,
# 다음 행의 첫번째 데이터 (44)를 찾기 위해 12byte(4*3) 만큼,
# 다음 열의 데이터(22)을 찾기 위해 4byte 만큼 뒤로 가야한다.
ndarray = ndarray.T #[[11,44],[22,55],[33,66]]
print(ndarray,ndarray.strides) #(4,12)
# 전치되면 3,2 행렬이 되므로,
# 다음 행의 첫번째 데이터(22)를 찾기 위해 4byte 만큼,
# 다음 열의 데이터(44)을 찾기 위해 12byte(4*3) 만큼 뒤로 가야한다.
#전치하는 방법 4가지
- ndarray = ndarray.transpose() #배열 객체 내에서 전치함수 콜
- ndarray = np.transpose(datas or ndarray) #라이브러리 내에서 전치함수 콜
- ndarray = ndarray.swapaxes(0,1) #swapaxes()활용
- ndarray = np.array(data).T #.T로도 가능
#전치를 통해 행렬 모양을 맞추면 행렬곱이 가능해진다.
- ndarray = np.array([[11,22,33],[11,22,33]]).T * np.array([[10],[100],[1000]]) #(2,3) >> (3,2)
- ndarray = np.array([[11,22,33],[11,22,33]]).T * np.array([[10,100,1000]]).T #(1,3) >> (3,1)
--예문 코드 보기--
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
print("numpy version",np.__version__) #numpy version check
print("---------------")
datas = [[11,22,33],[44,55,66]]
ndarray = np.array(datas)
print(ndarray, ndarray.shape)
print(ndarray, ndarray.strides)
#전치 : 행렬 변경 (2,3) >> (3,2) 를 하는 방법들
#일렬로 된 데이터는 동일하게 사용되며, 데이터 값을 찾는 거리만 달라지므로, strides의 보폭이 대치된다.
#원본에 영향을 안주기 때문에 원본에 재할당 해야한다.
print("--ndarray.transpose()---")
ndarray = ndarray.transpose() #배열 객체 내에서 전치함수 콜
print(ndarray,ndarray.shape)
print(ndarray, ndarray.strides)
print("--np.transpose(datas)---")
ndarray = np.transpose(datas) #라이브러리 내에서 전치함수 콜
print(ndarray,ndarray.shape)
print(ndarray, ndarray.strides)
print("--ndarray.swapaxes(0,1)--")
datas = [[11,22,33],[44,55,66]] #shape : (2,3)
ndarray = np.array(datas)
ndarray = ndarray.swapaxes(0,1) #swapaxes()활용
print(ndarray,ndarray.shape) #(3,2)
print(ndarray, ndarray.strides)
print("-----ndarray.T-----")
datas = [[11,22,33],[44,55,66]] #shape : (2,3)
ndarray = np.array(datas)
ndarray = ndarray.T #.T로도 가능
print(ndarray,ndarray.shape) #(3,2)
print(ndarray, ndarray.strides)
print("-----ndarray.T-----")
data = [[11,22,33,44,55,66]]
ndarray = np.array(data)
print(ndarray)
ndarray = np.array(data).T
print(ndarray)
print(ndarray,ndarray.shape) #(6,1)
print(ndarray, ndarray.strides) #(4,24)
#print(dir(np))
#print(np.append(ndarray,[[77]],axis=0))
print("---------------")
#전치를 통해 행렬 모양을 맞추면 행렬곱이 가능해진다.
ndarray = np.array([[11,22,33],[11,22,33]]).T * np.array([[10],[100],[1000]]) #(2,3) >> (3,2)
print(ndarray)
print("---------------")
#전치를 통해 행렬 모양을 맞추면 행렬곱이 가능해진다.
ndarray = np.array([[11,22,33],[11,22,33]]).T * np.array([[10,100,1000]]).T #(1,3) >> (3,1)
print(ndarray)
#04append_concatenate - 배열 병합
#기존의 배열 병합 방법
- print(datas1 + datas2) #행으로 더할 때
- for i in range(len(datas_sum)): #열로 더할 때
>> datas_sum[i].append(datas3[0][i])
>>print(datas_sum)
#ndarray type으로 배열을 병합 할 때는 병합할 배열의 차원이 같아야 한다.
<np.append(넣을 대상,추가 내용,axis=0,1)>
- ndarray = np.append(datas1,datas2,axis=0) #list
- ndarray = np.append(np.array(datas1),np.array(datas2),axis=0) #ndarray
- ndarray = np.append(ndarray,np.array(datas3).T,axis=1) #ndarray
<np.concatenate((넣을 대상,추가 내용),axis=0,1)>
- ndarray = np.concatenate((datas1,datas2),axis=0) #list
- ndarray = np.concatenate((np.array(datas1),np.array(datas2)),axis=0) #ndarray
- ndarray = np.concatenate((ndarray,np.array(datas3).T),axis=1) #ndarray
--예문 코드 보기--
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import numpy as np
print("numpy version",np.__version__) #numpy version check
print("---------------")
#print(dir(np)) #append, concatenate
#print(dir(ndarray))
datas1 = [[11,22,33],[44,55,66]]
datas2 = [[77,88,99]]
datas3 = [[10,100,1000]]
print("---datas1 + datas2----")
print(datas1 + datas2)
print(np.array(datas1 + datas2))
#np.append(넣을 대상,추가 내용,axis=0,1) - #같은 차원의 배열이어야 한다.
# >> np.append(ndarray,list or ndarray,axis=0,1)
print("--- ndarray (list/append/concatenate) ----")
print("--- list ----")
ndarray = np.append(datas1,datas2,axis=0) #list
print("append\n",ndarray)
ndarray = np.concatenate((datas1,datas2),axis=0) #list
print("concatenate\n",ndarray)
print("--- axis=0 ----")
ndarray = np.append(np.array(datas1),np.array(datas2),axis=0) #ndarray
print("append\n",ndarray)
ndarray = np.concatenate((np.array(datas1),np.array(datas2)),axis=0) #ndarray
print("concatenate\n",ndarray)
print("--- axis=1 ----")
ndarray = np.append(ndarray,np.array(datas3).T,axis=1) #ndarray
print("append\n",ndarray)
ndarray = np.concatenate((ndarray,np.array(datas3).T),axis=1) #ndarray
print("concatenate\n",ndarray)
print("==================")
#열에다가 데이터를 넣고 싶을 때
datas1 = [[11,22,33],[44,55,66]]
datas2 = [[77,88,99]]
print("---datas1 + datas2----")
datas_sum = datas1 + datas2
datas3 = [[10,100,1000]]
for i in range(len(datas_sum)):
datas_sum[i].append(datas3[0][i])
#print(i)
#print(datas_sum[i])
print(datas_sum)
print("---- mission ----")
datas = [[i for i in range(1,6)],[i for i in range(5,10)]]
col_datas = [[10,100]]#column append
row_datas = [[10,20,30,40,50]]#row append
#1.list
print(datas)
print(len(datas))
datas = datas + row_datas
print("list_row:",datas)
datas = [[i for i in range(1,6)],[i for i in range(5,10)]]
for i in range(len(datas)):
print(datas[i],col_datas[0][i])
datas[i].append(col_datas[0][i])
print("list_col:",datas)
#2.append
datas = [[i for i in range(1,6)],[i for i in range(5,10)]]
col_datas = [[10,100]]#column append
row_datas = [[10,20,30,40,50]]#row append
ndarray = np.append(np.array(datas),np.array(row_datas),axis=0) #ndarray
print("append_row:",ndarray)
ndarray = np.append(np.array(datas),np.array(col_datas).T,axis=1) #ndarray
print("append_col:",ndarray)
#3.concatenate
ndarray = np.concatenate((np.array(datas),np.array(row_datas)),axis=0)
print("concatenate_row:",ndarray)
ndarray = np.concatenate((np.array(datas),np.array(col_datas).T),axis=1)
print("concatenate_col:",ndarray)