Python 데이터 분석
Python 데이터분석 기초 3 - 배열 연산, 벡터 간 내적 연산, 파일 저장, 불러오기
코딩탕탕
2022. 10. 28. 16:16
# 배열 연산
import numpy as np
x = np.array([[1,2],[3,4]], dtype = np.float64) # 데이터 타입을 지정 가능
print(x, x.dtype)
y = np.arange(5, 9).reshape(2,2)
y = y.astype(np.float32)
print(y, y.dtype)
print()
print(x + y) # 행열 덧셈
print(np.add(x,y)) # 같은 방법(속도가 더 빠르다)
imsi = np.random.rand(1000000)
print(imsi)
print(sum(imsi)) # 파이썬의 함수(속도 느림)
print(np.sum(imsi)) # numpy의 함수(속도 빠름)
print()
print(x - y)
print(np.subtract(x,y)) # 같은 방법 -
print()
print(x * y)
print(np.multiply(x,y)) # 같은 방법 *
print()
print(x / y)
print(np.divide(x,y)) # 같은 방법 /
print()
# 벡터 간 내적 연산 : dot함수 사용(python), R에서는 %*% 사용했다.
v = np.array([9, 10])
w = np.array([11,12])
print(v *w)
print(v.dot(w)) # v[0] * w[0] + v[1] * w[1]
print(np.dot(v,w)) # np 사용
print()
print(x) # 2차원
print(v) # 1차원
print(np.dot(x,v)) # x[0, 0] * v[0] + x[0, 1] * v[1] = 29, x[1, 0] * v[0] + x[1, 1] * v[1] = 67
print()
print(x) # 2차원
print(y) # 2차원
print(np.dot(x,y)) # x[0, 0] * y[0, 0] + x[0, 1] * y[1, 0] = 19, ...
print('------------')
print(np.sum(x))
print(np.mean(x))
print(np.cumsum(x)) # 누적합
print(np.cumprod(x)) # 누적곱
# ...
print()
name1 = np.array(['tom','james','tom','oscar'])
name2 = np.array(['tom','page','john'])
print(np.unique(name1)) # 중복 배제
print(np.intersect1d(name1, name2)) # 교집합\
print(np.intersect1d(name1, name2, assume_unique=True)) # 교집합, 중복 허용
print(np.union1d(name1, name2)) # 합집합
print('\nTranspose : 전치')
print(x)
print(x.T)
print(x.transpose())
print(x.swapaxes(0, 1))
print('\nBroadcast 연산 : 크기가 다른 배열 간의 연산을 하면 작은 배열이 큰 배열의 크기를 자동으로 따라간다.')
x = np.arange(1, 10).reshape(3, 3)
print(x)
y = np.array([1,0,1])
print(x + y)
print()
print(x)
np.savetxt('my.txt', x) # 파일로 저장 가능하다.
imsi = np.loadtxt('my.txt') # 저장된 파일을 불러온다.
print(imsi)
print()
imsi2 = np.loadtxt('my2.txt', delimiter = ',') # 저장된 파일을 불러온다. ,로 분리해준다.
print(imsi2)
<console>
[[1. 2.]
[3. 4.]] float64
[[5. 6.]
[7. 8.]] float32
[[ 6. 8.]
[10. 12.]]
[[ 6. 8.]
[10. 12.]]
[0.75608015 0.05434852 0.50819626 ... 0.81784943 0.93267389 0.87782032]
499725.1706093457
499725.1706093464
[[-4. -4.]
[-4. -4.]]
[[-4. -4.]
[-4. -4.]]
[[ 5. 12.]
[21. 32.]]
[[ 5. 12.]
[21. 32.]]
[[0.2 0.33333333]
[0.42857143 0.5 ]]
[[0.2 0.33333333]
[0.42857143 0.5 ]]
[ 99 120]
219
219
[[1. 2.]
[3. 4.]]
[ 9 10]
[29. 67.]
[[1. 2.]
[3. 4.]]
[[5. 6.]
[7. 8.]]
[[19. 22.]
[43. 50.]]
------------
10.0
2.5
[ 1. 3. 6. 10.]
[ 1. 2. 6. 24.]
['james' 'oscar' 'tom']
['tom']
['tom' 'tom']
['james' 'john' 'oscar' 'page' 'tom']
Transpose : 전치
[[1. 2.]
[3. 4.]]
[[1. 3.]
[2. 4.]]
[[1. 3.]
[2. 4.]]
[[1. 3.]
[2. 4.]]
Broadcast 연산 : 크기가 다른 배열 간의 연산을 하면 작은 배열이 큰 배열의 크기를 자동으로 따라간다.
[[1 2 3]
[4 5 6]
[7 8 9]]
[[ 2 2 4]
[ 5 5 7]
[ 8 8 10]]
[[1 2 3]
[4 5 6]
[7 8 9]]
[[1. 2. 3.]
[4. 5. 6.]
[7. 8. 9.]]
[[1. 2. 3.]
[4. 5. 6.]]
Numpy는 브로드캐스팅을 자동으로 적용시켜준다.

브로드캐스팅(Broadcasting)은 모양이 다른 배열들 간의 연산이 어떤 조건을 만족했을 때 가능해지도록 배열을 자동적으로 변환하는 것이라고 정의할 수 있다. 그리고 누락되었거나 길이가 1인 차원에 대해 브로드캐스팅이 수행된다.
위의 세 그림은 배열 연산에서 항상 1차원 배열이 포함되어 있다. 그리고 행/열의 어떤 축이든(;0번/1번 어떤 축이든) 차원의 길이가 같은 것을 알 수 있다. 3x3 + 1x3, 3x1 + 1x3
브로드캐스팅이 일어날 수 있는 조건은 다음과 같다.
- 차원의 크기가 1일때 가능하다
두 배열 간의 연산에서 최소한 하나의 배열의 차원이 1이라면(0번 축이든 1번 축이든; 1행이든 1열이든) 가능하다. - 차원의 짝이 맞을 때 가능하다
차원에 대해 축의 길이가 동일하면 브로드캐스팅이 가능하다.
출처: https://sacko.tistory.com/16 [데이터 분석하는 문과생, 싸코:티스토리]