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일때 가능하다
    두 배열 간의 연산에서 최소한 하나의 배열의 차원이 1이라면(0번 축이든 1번 축이든; 1행이든 1열이든) 가능하다.
  2. 차원의 짝이 맞을 때 가능하다
    차원에 대해 축의 길이가 동일하면 브로드캐스팅이 가능하다.

출처: https://sacko.tistory.com/16 [데이터 분석하는 문과생, 싸코:티스토리]