numpy를 이해하기 위해 작성한 함수들이다.
문제 설명과 코드는 여기에!
1. n의 제곱수로 2 dimentional array를 생성하는 ndarray.
def n_size_ndarray_creation(n, dtype=np.int8):
return np.array(range(n**2), dtype).reshape(n,n)
# 실행결과
print(n_size_ndarray_creation(3))
print()
[[0 1 2]
[3 4 5]
[6 7 8]]
2. shape이 지정된 크기의 ndarray를 생성,
이때 행렬의 element는 type에 따라 0, 1 또는 empty로 생성됨
type : 생성되는 element들의 값을 지정함
0은 0, 1은 1, 99는 empty 타입으로 생성됨
def zero_or_one_or_empty_ndarray(shape, type=0, dtype=np.int8):
if type == 0:
return np.zeros(shape, dtype)
elif type == 1:
return np.ones(shape, dtype)
elif type == 99:
return np.empty(shape, dtype)
# 실행 결과
print(zero_or_one_or_empty_ndarray(shape=(2,2), type=1))
print()
print(zero_or_one_or_empty_ndarray(shape=(3,3), type=99))
print()
[[1 1]
[1 1]]
[[0 1 2]
[3 4 5]
[6 7 8]]
3. 입력된 ndarray X를 n_row의 값을 row의 개수로 지정한 matrix를 반환함.
이때 입력하는 X의 size는 2의 거듭제곱수로 전제함.
만약 n_row과 1일 때는 matrix가 아닌 vector로 반환함.
def change_shape_of_ndarray(X, n_row):
# 내가 짠 코드 : return X.reshape(n_row, -1) 이지만
# n_row가 1일 때는 matrix가 아닌 vector로 반환해야하므로 flatten() 써줘야 함
return X.flatten() if n_row == 1 else X.reshape(n_row, -1)
# 실행 결과
X = np.ones((32,32), dtype=np.int8)
print(change_shape_of_ndarray(X, 1))
print()
print(change_shape_of_ndarray(X, 512))
print()
[1 1 1 ... 1 1 1]
[[1 1]
[1 1]
[1 1]
...
[1 1]
[1 1]
[1 1]]
4. 입력된 ndarray X_1과 X_2를 axis로 입력된 축을 기준으로 통합하여 반환하는 함수
X_1과 X_2는 matrix 또는 vector 임, 그러므로 vector 일 경우도 처리할 수 가 있어야 함
axis를 기준으로 통합할 때, 통합이 불가능하면 False가 반환됨.
단 X_1과 X_2 Matrix, Vector 형태로 들어왔다면, Vector를 row가 1개인 Matrix로 변환하여 통합이 가능한지 확인할 것
def concat_ndarray(X_1, X_2, axis):
# 강의영상 참고
try : # vector형태로 들어왔다면 vector를 row가 1개인 matrix로 변경
if X_1.ndim == 1:
X_1 = X_1.reshape(1, -1)
if X_2.ndim == 1:
X_2 = X_2.reshape(1, -1)
return np.concatenate((X_1, X_2), axis)
# concat을 해서 안되면 value 에러가 남
except ValueError as e:
return False
# 실행 결과
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6]])
print(concat_ndarray(a, b, 0))
print()
print(concat_ndarray(a, b, 1))
print()
a = np.array([1, 2])
b = np.array([5, 6, 7])
print(concat_ndarray(a, b, 1))
print()
print(concat_ndarray(a, b, 0))
[[1 2]
[3 4]
[5 6]]
False
[[1 2 5 6 7]]
False
5. 입력된 Matrix 또는 Vector를 ndarray X의 정규화된 값으로 변환하여 반환함
이때 정규화 변환 공식 Z = (X - X의평균) / X의 표준편차로 구성됨.
X의 평균과 표준편차는 axis를 기준으로 axis 별로 산출됨.
Matrix의 경우 axis가 0 또는 1일 경우, row 또는 column별로 Z value를 산출함.
axis가 99일 경우 전체 값에 대한 normalize 값을 구함.
def normalize_ndarray(X, axis=99, dtype=np.float32):
# 어려워요 ㅠㅠ 강의 참고
X = X.astype(np.float32) # X를 float 형으로 바꾸기
n_row, n_column = X.shape # tuple형태의 X.shape 를 unpacking
if axis == 99 : # 전체 값에 대한 normalize 값 구하기
x_mean = np.mean(X)
x_std = np.std(X)
Z = (X - x_mean) / x_std
if axis == 0 : # row 별로 Z value를 산출
x_mean = np.mean(X, 0).reshape(1, -1)
x_std = np.std(X, 0).reshape(1, -1)
Z = (X - x_mean) / x_std
if axis == 1:
x_mean = np.mean(X, 1).reshape(n_row, -1)
x_std = np.std(X, 1).reshape(n_row, -1)
Z = (X - x_mean) / x_std
return Z
# 실행 결과
X = np.arange(12, dtype=np.float32).reshape(6,2)
print(normalize_ndarray(X))
print()
print(normalize_ndarray(X, 1))
print()
print(normalize_ndarray(X, 0))
print()
def normalize_ndarray(X, axis=99, dtype=np.float32):
# 어려워요 ㅠㅠ 강의 참고
X = X.astype(np.float32) # X를 float 형으로 바꾸기
n_row, n_column = X.shape # tuple형태의 X.shape 를 unpacking
if axis == 99 : # 전체 값에 대한 normalize 값 구하기
x_mean = np.mean(X)
x_std = np.std(X)
Z = (X - x_mean) / x_std
if axis == 0 : # row 별로 Z value를 산출
x_mean = np.mean(X, 0).reshape(1, -1)
x_std = np.std(X, 0).reshape(1, -1)
Z = (X - x_mean) / x_std
if axis == 1:
x_mean = np.mean(X, 1).reshape(n_row, -1)
x_std = np.std(X, 1).reshape(n_row, -1)
Z = (X - x_mean) / x_std
return Z
# 실행 결과
X = np.arange(12, dtype=np.float32).reshape(6,2)
print(normalize_ndarray(X))
print()
print(normalize_ndarray(X, 1))
print()
print(normalize_ndarray(X, 0))
print()
[[-1.593255 -1.3035723 ]
[-1.0138896 -0.7242068 ]
[-0.4345241 -0.14484136]
[ 0.14484136 0.4345241 ]
[ 0.7242068 1.0138896 ]
[ 1.3035723 1.593255 ]]
[-1. 1.]
[-1. 1.]
[-1. 1.]
[-1. 1.]
[-1. 1.]]
[[-1.46385 -1.46385]
[-0.87831 -0.87831]
[-0.29277 -0.29277]
[ 0.29277 0.29277]
[ 0.87831 0.87831]
[ 1.46385 1.46385]]
6. 입력된 ndarray X를 String type의 condition 정보를 바탕으로 해당 컨디션에 해당하는 ndarray X의 index 번호를 반환함
단 이때, str type의 조건인 condition을 코드로 변환하기 위해서는 eval(str("X") + condition)를 사용할 수 있음
def boolean_index(X, condition):
condition = eval(str("X") + condition)
return np.where(condition)
# 실행 결과
X = np.arange(32, dtype=np.float32).reshape(4, -1)
print(boolean_index(X, "== 3"))
print()
X = np.arange(32, dtype=np.float32)
print(boolean_index(X, "> 6"))
print()
(array([0], dtype=int64), array([3], dtype=int64))
(array([ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31], dtype=int64),)
7. 입력된 vector type의 ndarray X에서 target_value와 가장 차이가 작게나는 element를 찾아 리턴함
이때 X를 list로 변경하여 처리하는 것은 실패로 간주함.
X: 입력하는 vector type의 ndarray
target_value : 가장 유사한 값의 기준값이 되는 값
def find_nearest_value(X, target_value):
return X[np.argmin(np.abs(X - target_value))]
# 실행 결과
X = np.random.uniform(0, 1, 100)
target_value = 0.3
print(find_nearest_value(X, target_value))
print()
0.3068021104851364
출력되는 값은 random 하게 바뀜
8. 입력된 vector type의 ndarray X에서 큰 숫자 순서대로 n개의 값을 반환함.
def get_n_largest_values(X, n):
# np.argsort 처음봄 -> 정리하기
return X[np.argsort(X[::1]) [:n]]
# 실행 결과
X = np.random.uniform(0, 1, 100)
print(get_n_largest_values(X, 3))
print()
print(get_n_largest_values(X, 5))
print()
[0.00040655 0.00632187 0.00703481]
[0.00040655 0.00632187 0.00703481 0.00813225 0.03024364]
출력되는 값은 random 하게 바뀜