-
파이썬 확장 패키지 : numpy (2)파이썬 Python/데이터 분석 2022. 2. 15. 21:27
문자열 데이터 numpy 배열 형변환
import numpy data1 = ['people', 'boy', 'girl', 'man', 'woman'] data2 = ['1.5', '2.5', '3.5', '4.5', '5.5'] data3 = ['10', '20', '30', '40', '50'] arr1 = numpy.array(data1) arr2 = numpy.array(data2) arr3 = numpy.array(data3) print("arr1 :", arr1) print("arr1 데이터 타입 :", arr1.dtype) # <U6 : 유니코드, 문자의 최대수는 6자 print("arr2 :", arr2) print("arr2 데이터 타입 :", arr2.dtype) # <U3 : 유니코드, 문자의 최대수는 3자 print("arr3 :", arr3) print("arr3 데이터 타입 :", arr3.dtype) # <U2 : 유니코드, 문자의 최대수는 2자 print() # 문자열을 실수로 변환 arr4 = arr2.astype(float) print("arr4 :", arr4) print("arr4 데이터 타입 :", arr4.dtype) print() # 문자열을 정수로 변환 : 반드시 문자열이 정수여야 함 arr5 = arr3.astype(int) print("arr5 :", arr5) print("arr5 데이터 타입 :", arr5.dtype) print() # arr4 = arr2.astype(int) # error 발생. 실수는 정수로 변환 불가 # 숫자를 문자열로 변환 arr6 = arr5.astype(str) print("arr6 :", arr6) print("arr6 데이터 타입 :", arr6.dtype) print()
arr1 : ['people' 'boy' 'girl' 'man' 'woman']
arr1 데이터 타입 : <U6
arr2 : ['1.5' '2.5' '3.5' '4.5' '5.5']
arr2 데이터 타입 : <U3
arr3 : ['10' '20' '30' '40' '50']
arr3 데이터 타입 : <U2
arr4 : [1.5 2.5 3.5 4.5 5.5]
arr4 데이터 타입 : float64
arr5 : [10 20 30 40 50]
arr5 데이터 타입 : int32
arr6 : ['10' '20' '30' '40' '50']
arr6 데이터 타입 : <U11난수 numpy 배열 생성
import numpy # 0 <= 실수 난수 < 1 사이의 난수 생성 f1 = numpy.random.rand() arr2 = numpy.random.rand(2, 3) arr3 = numpy.random.rand(2, 3, 4) print("f1 :", f1) print("arr2 :") print(arr2) print("arr3 :") print(arr3) print("f1 type :", type(f1)) print("arr2 type :", type(arr2)) print("arr2 배열 데이터 타입 :", arr2.dtype) print("arr2 배열 형태 :", arr2.shape) print("arr3 배열 형태 :", arr3.shape) print() # 정수 난수 : low <= 난수 < high # random.randint([low,] high[, size]), 기본값 : low = 0, size = 1 n1 = numpy.random.randint(10) # 0~9의 정수 난수 1개 생성 arr2 = numpy.random.randint(1, 10, size=(2, 3)) # 1~9의 2x3 행렬로 정수 난수 생성 arr3 = numpy.random.randint(10, size=(2, 3, 4)) print("n1 :", n1) print("arr2 :") print(arr2) print("arr3 :") print(arr3) print("n1 type :", type(n1)) print("arr2 type :", type(arr2)) print("arr2 배열 데이터 타입 :", arr2.dtype) print("arr2 배열 형태 :", arr2.shape) print("arr3 배열 형태 :", arr3.shape)
f1 : 0.8180219262188141
arr2 :
[[0.70143542 0.83651168 0.80882758]
[0.70057787 0.34950894 0.21387394]]
arr3 :
[[[0.81915646 0.28758555 0.15883754 0.72291305]
[0.00822344 0.72063841 0.0236434 0.8494338 ]
[0.78139699 0.99672498 0.51678926 0.65930833]]
[[0.91431708 0.39219886 0.86225485 0.82198564]
[0.62223915 0.66120988 0.86454185 0.87464912]
[0.2036204 0.93094409 0.57048143 0.38013993]]]
f1 type : <class 'float'>
arr2 type : <class 'numpy.ndarray'>
arr2 배열 데이터 타입 : float64
arr2 배열 형태 : (2, 3)
arr3 배열 형태 : (2, 3, 4)
n1 : 6
arr2 :
[[8 5 8]
[4 9 5]]
arr3 :
[[[0 5 2 3]
[9 6 3 9]
[1 1 5 1]]
[[9 4 8 1]
[5 1 1 9]
[2 6 7 3]]]
n1 type : <class 'int'>
arr2 type : <class 'numpy.ndarray'>
arr2 배열 데이터 타입 : int32
arr2 배열 형태 : (2, 3)
arr3 배열 형태 : (2, 3, 4)Numpy 배열의 연산
1) 사칙 연산
- 배열의 형태(shape)가 같다면 덧셈, 뺄셈, 곱셈, 나눗셈 연산을 할 수 있다.
2) 통계 연산
- 배열의 합, 평균, 표준편차, 분산, 최소값, 최대값, 누적합, 누적곱 등 통계에 많이 이용하는 메소드도 있다.
★ 편차 = 자료형 - 평균
★ 분산 = 편차^2 의 평균
★ 표준편차 = √분산
3) 행렬 연산
- Numpy는 배열의 단순 연산뿐만 아니라 선형 대수(Linear algebra)를 위한 행렬(2차원 배열) 연산도 지원한다.
- 간단하게 행렬곱, 전치행렬, 역행렬, 행렬식 등을 구할 수 있다.
(a b) (c
d)
★ 행렬곱 : ac + bd
(a b (e
c d) f)
★ 행렬곱 : ae + bf
: ce + bf
(a b (e f
c d) g h)
★ 행렬곱 : ae + bg, af + bh
: ce + dg, cf + dh
★ 전치행렬 : 행과 열을 바꿈.
a b c d e f
-> a d
b e
c f
★ 행렬식 : det(A) = ad - bc
A = (a b c d)
★ 역행렬 : 행렬식이 0이면 역행렬은 존재하지 않음.
: AB = BA 이면 역행렬
(a b ^-1 -> 1/det(A) * (d -b
c d) -c a)
import numpy data1 = [10, 20, 30, 40] data2 = [100, 200, 300, 400] # numpy 배열 생성 arr1 = numpy.array(data1) arr2 = numpy.array(data2) arr_add = arr1 + arr2 arr_sub = arr1 - arr2 arr_mul = arr1 * arr2 arr_div = arr1 / arr2 arr_add2 = arr1 + 7 arr_square = arr1 ** 2 # numpy 배열 속성확인 print("arr1 배열 형태 :", arr1.shape) print("arr2 배열 형태 :", arr2.shape) print() # 저장 내용 확인 print("arr1 :", arr1) print("arr2 :", arr2) print("arr_add :", arr_add) print("arr_sub :", arr_sub) print("arr_mul :", arr_mul) print("arr_div :", arr_div) print("arr_add2 :", arr_add2) print("arr_square :", arr_square)
arr1 배열 형태 : (4,)
arr2 배열 형태 : (4,)
arr1 : [10 20 30 40]
arr2 : [100 200 300 400]
arr_add : [110 220 330 440]
arr_sub : [ -90 -180 -270 -360]
arr_mul : [ 1000 4000 9000 16000]
arr_div : [0.1 0.1 0.1 0.1]
arr_add2 : [17 27 37 47]
arr_square : [ 100 400 900 1600]import numpy arr1 = numpy.array([10, 20, 30, 40, 50, 60]) print(arr1) print('-' * 30) # 통계 연산 방법1 print(arr1.sum()) # 합 print(arr1.mean()) # 평균 print(arr1.std()) # 표준편차 print(arr1.var()) # 분산 print(arr1.min()) # 최소값 print(arr1.max()) # 최대값 print(arr1.cumsum()) # 누적합 print(arr1.cumprod()) # 누적곱 print() # 통계 연산 방법2 print(numpy.sum(arr1)) # 합 print(numpy.mean(arr1)) # 평균 print(numpy.std(arr1)) # 표준편차 print(numpy.var(arr1)) # 분산 print(numpy.min(arr1)) # 최소값 print(numpy.max(arr1)) # 최대값 print(numpy.cumsum(arr1)) # 누적합 print(numpy.cumprod(arr1)) # 누적곱 print() # 2차원 배열에서의 평균 구하기 arr2 = arr1.reshape(2, 3) print('arr2 :') print(arr2) print(numpy.mean(arr2)) # 전체 평균 print(numpy.mean(arr2, axis=0)) # 열 평균 print(numpy.mean(arr2, axis=1)) # 행 평균
[10 20 30 40 50 60]
------------------------------
210
35.0
17.07825127659933
291.6666666666667
10
60
[ 10 30 60 100 150 210]
[ 10 200 6000 240000 12000000 720000000]
210
35.0
17.07825127659933
291.6666666666667
10
60
[ 10 30 60 100 150 210]
[ 10 200 6000 240000 12000000 720000000]
arr2 :
[[10 20 30]
[40 50 60]]
35.0
[25. 35. 45.]
[20. 50.]import numpy # numpy 배열 생성 arr1 = numpy.array([1, 2, 3, 4]).reshape(2, 2) arr2 = numpy.array([10, 20, 30, 40]).reshape(2, 2) print("arr1 :") print(arr1) print("arr2 :") print(arr2) print("arr1 배열 형태 :", arr1.shape) print("arr2 배열 형태 :", arr2.shape) print("--------------") arr_dot = numpy.dot(arr1, arr2) # 행렬곱 arr_transpose = numpy.transpose(arr1) # 전치 행렬 arr_inv = numpy.linalg.inv(arr1) # 역행렬 arr_det = numpy.linalg.det(arr1) # 행렬식 print("arr_dot :") print(arr_dot) print("arr_transpose :") print(arr_transpose) print("arr_inv :") print(arr_inv) print("arr_det :", arr_det) print("--------------") # 역행렬 확인, AB = I(단위 행렬) arr3 = numpy.linalg.inv(arr1) print(numpy.dot(arr1, arr3)) # 행렬곱
arr1 :
[[1 2]
[3 4]]
arr2 :
[[10 20]
[30 40]]
arr1 배열 형태 : (2, 2)
arr2 배열 형태 : (2, 2)
--------------
arr_dot :
[[ 70 100]
[150 220]]
arr_transpose :
[[1 3]
[2 4]]
arr_inv :
[[-2. 1. ]
[ 1.5 -0.5]]
arr_det : -2.0000000000000004
--------------
[[1.00000000e+00 1.11022302e-16]
[0.00000000e+00 1.00000000e+00]]numpy 배열의 인덱싱과 슬라이싱
import numpy arr1 = numpy.array([10, 20, 30, 40, 50, 60]) arr2 = numpy.arange(10, 100, 10).reshape(3, 3) print("arr1 :", arr1) print("arr2 :") print(arr2) print("arr1 배열 형태 :", arr1.shape) print("arr2 배열 형태 :", arr2.shape) print('-' * 30) # 1차원 배열 인덱싱 print("arr1[2] :", arr1[2]) print("arr1[[1, 3, 5]] :", arr1[[1, 3, 5]]) # 원하는 인덱스값 지정 print("arr1[arr1 > 30] :", arr1[arr1 > 30]) # 조건 지정 print('-' * 30) arr1[2] = 555 print("arr1 :", arr1) arr1[[0, 2, 3]] = [666, 777, 888] print("arr1 :", arr1) arr1[arr1 > 30] = 0 print("arr1 :", arr1) print('-' * 30) # 2차원 배열 인덱싱 # [행, 열] print("arr2[0, 2] :", arr2[0, 2]) arr2[0, 2] = 35 # 값 1개 변경 print("arr2 :") print(arr2) arr2[1] = numpy.array([45, 55, 65]) # 1개 행 전부 변경 print("arr2 :") print(arr2) arr2[2] = [75, 85, 95] # 1개 행 전부 변경 print("arr2 :") print(arr2) print('-' * 30) # 행과 열의 위치를 지정, arr2[0,0], arr2[2, 1] 선택 print("arr2[[0, 2], [0, 1]] :", arr2[[0, 2], [0, 1]]) # 0행0열, 2행1열 지정 arr2[[0, 2], [0, 1]] = [666, 777] print("arr2 :") print(arr2)
arr1 : [10 20 30 40 50 60]
arr2 :
[[10 20 30]
[40 50 60]
[70 80 90]]
arr1 배열 형태 : (6,)
arr2 배열 형태 : (3, 3)
------------------------------
arr1[2] : 30
arr1[[1, 3, 5]] : [20 40 60]
arr1[arr1 > 30] : [40 50 60]
------------------------------
arr1 : [ 10 20 555 40 50 60]
arr1 : [666 20 777 888 50 60]
arr1 : [ 0 20 0 0 0 0]
------------------------------
arr2[0, 2] : 30
arr2 :
[[10 20 35]
[40 50 60]
[70 80 90]]
arr2 :
[[10 20 35]
[45 55 65]
[70 80 90]]
arr2 :
[[10 20 35]
[45 55 65]
[75 85 95]]
------------------------------
arr2[[0, 2], [0, 1]] : [10 85]
arr2 :
[[666 20 35]
[ 45 55 65]
[ 75 777 95]]import numpy arr1 = numpy.array([10, 20, 30, 20, 50, 60]) arr2 = numpy.arange(10, 100, 10).reshape(3, 3) print("arr1 :", arr1) print("arr2 :") print(arr2) print("arr1 배열 형태 :", arr1.shape) print("arr2 배열 형태 :", arr2.shape) print('-' * 30) # 1차원 배열 슬라이싱 print(arr1[1:4]) print(arr1[:4]) print(arr1[1:]) print(arr1[:]) print(arr1[::-1]) print('-' * 30) arr1[2:5] = [35, 45, 55] # 부분 값 변경 print("arr1 :", arr1) arr1[2:5] = 37 # 부분을 같은 값 변경 print("arr1 :", arr1) print("--------------") # 2차원 배열 슬라이싱 # 배열명[행슬라이싱 , 열슬라이싱] # => 배열명[행시작위치:행끝위치, 열시작위치:열끝위치] print(arr2[1:3, 0:2]) # 행은 1~2, 열은 0~1 슬라이싱 print(arr2[:3, :2]) # 행은 처음~2, 열은 처음~1 슬라이싱 print("--------------") # 특정 행의 열만 추출하기, 배열명[행위치][열시작위치:열끝위치] print(arr2[1][0:2]) print("--------------") print(arr2[:, 2]) # 특정 열만 추출하기 print(arr2[:, [1,2]]) # 특정 열만 추출하기 print(arr2[2, :]) # 특정 행만 추출하기
arr1 : [10 20 30 20 50 60]
arr2 :
[[10 20 30]
[40 50 60]
[70 80 90]]
arr1 배열 형태 : (6,)
arr2 배열 형태 : (3, 3)
------------------------------
[20 30 20]
[10 20 30 20]
[20 30 20 50 60]
[10 20 30 20 50 60]
[60 50 20 30 20 10]
------------------------------
arr1 : [10 20 35 45 55 60]
arr1 : [10 20 37 37 37 60]
--------------
[[40 50]
[70 80]]
[[10 20]
[40 50]
[70 80]]
--------------
[40 50]
--------------
[30 60 90]
[[20 30]
[50 60]
[80 90]]
[70 80 90]'파이썬 Python > 데이터 분석' 카테고리의 다른 글
Matplotlib (2) - 산점도, 막대 그래프, 히스토그램 (0) 2022.02.16 Matplotlib (1) - 그래프 (0) 2022.02.16 파이썬 확장 패키지 : numpy (1) (0) 2022.02.14 반복문 - while (0) 2022.02.09 반복문 - for (0) 2022.02.08