본문 바로가기

Python

[Python] 넘파이(numpy)_1.배열의 특성(size, strides, dimention), 전치(transpose), 병합(append, concatenate)

#정리

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