본문 바로가기
DATA | AI/빅데이터분석

[빅데이터분석 | Numpy] 5. Numpy exercise 100 (1~20) : f-string, arange(), 슬라이싱(slicing), nonzero, np.random, np.diag

by 솨앙 2024. 10. 24.
반응형

기본적인? 문법들은 다뤄봤으니 예제를 풀어보겠습니다!

numpy exercise를 검색했더니 되게 유명한 예제처럼 보이는 Numpy exercise 100이 있어서 풀어보면서 놓친 개념들 살펴보기!

https://github.com/rougier/numpy-100/blob/master/100_Numpy_exercises.ipynb

 

numpy-100/100_Numpy_exercises.ipynb at master · rougier/numpy-100

100 numpy exercises (with solutions). Contribute to rougier/numpy-100 development by creating an account on GitHub.

github.com

세상에 똑똑이들은 참 많다... 

+ 해당 깃에서 제공하는 정답과 제 정답 코드는 다를 수 있습니다

 

4. how to find the memory of any array (*)
arr = np.zeros((10,10))
print(f"{arr.size * arr.itemsize} bytes")

zeros 행렬에 관해서는 공부한 적이 있다. 0으로 초기화된 행렬을 만드는 것!

- 여기서 중요한 것은 : zeros행렬의 기본 데이터 타입은 float64타입으로 요소 당 8비트를 차지한다.

기억이 안 난다면 행렬 속 원소의 데이터 크기를 알려주는 함수 arr.itemsize() 을 사용해서 확인 가능 

 

[추가적으로 새로 알게 된 것 : f-string]

파이썬을 각잡고 제대로 공부한 적이 없어서 이제야 알았다..ㅎ

- F- string을 사용하면 간결하고 가독성이 좋은 방식으로 문자열에 변수를 삽입할 수 있다.

 

7. create a vector with values ranging from 10 to 49(*)
arr = np.arange(10,50)
print(arr)

arange 함수를 사용하여 벡터를 만드는 건 앞서 공부한 적이 있다.

 

[추가적으로 알게 된 점]

출력을 보니 1차원이어서 혹시 다른 차원의 행렬로 출력을 할 수 있는지 궁금해졌다.

그러나 arange함수는 1차원의 배열만을 반환한다

-> 모양을 바꾸기 위해서는 reshape()등의 추가적인 작업을 해줘야한다.

arr = np.arange(10,50).reshape(2,-1)
print(arr)

이렇게 해주면 2행 *렬의 2차원 행렬이 나온다

 

8. reverse a vector(first element becomes last)(*)

 

arr = np.arange(0,10)
print(arr)
arr = arr[::-1]
print(arr)

 

슬라이싱 기법은 앞선 포스팅에서 다뤄 본 적이 없으니 이 참에 알아보자

numpy배열에서는 슬라이싱과 인덱싱을 사용하여 배열을 부분적으로 참조하고, 값을 수정할 수 있다.
arr[start:end:step] 을 사용한다
ex. v1 = arr[1:2]
- arr의 인덱스 1부터 2 전까지를 저장한다.
ex. v2 = arr[1::3]
- arr의 1부터 3씩 건너뛰며 값을 v2에 저장한다.

 

즉 여기서 사용한 [::-1]을 살펴보자.

- start 과 end가 생략되었으므로, 0부터 맨 끝까지를 의미한다.

- step = -1은 배열의 요소들을 거꾸로 가져오는 것을 의미한다.

 

10. Find indices of non-zero elements from [1,2,0,0,4,0] (★☆☆)
arr = np.nonzero([1,2,0,0,4,0])
print(arr)

nonzero 함수도 이전에 다룬 적이 없다.

np.nonzero() 함수는 배열에서 0이 아닌 값의 인덱스를 반환하는 함수이다.
다차원 배열에서도 사용이 가능한데 
(array([0, 1, 1, 2]), array([1, 0, 2, 1]))
출력 값이 다음과 같이 구성된다. 앞은 행 인덱스 이며 뒤에는 열 인덱스 이다.

 

이를 활용해서 0이 아닌 값들만 가져올 수 있다.

arr=np.array([1,2,0,0,4,0])
index = np.nonzero(arr)
print(index)
print(arr[index])
12. Create a 3x3x3 array with random values (★☆☆)
arr= np.random.random((3,3,3))
print(arr)

numpy 에서는 난수 생성 함수를 제공한다

np.random.random() 과 random.rand()는 모두 [0,1) 범위에서 난수를 생성한다.

둘의 차이점은 함수 사용 방식이다.

- np.random.random() 함수는 차원의 크기를 튜플로 주어준다.

- np.random.rand()는 차원의 크기를 직접 바로 입력하여 준다.

 

15. Create a 2d array with 1 on the border and 0 inside (★☆☆)

 

Z = np.ones((10,10))
Z[1:-1,1:-1] = 0
print(Z)

 

앞선 문제에 나왔던 슬라이싱의 응용이다.

[1:-1]은 1번 인덱스 부터 마지막 바로 직전까지의 인덱스를 의미한다.

 

18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆)
arr = np.diag(1+np.arange(0,4), k=-1)
print(arr)

diagonal matrix 는 대각 행렬로, 주대각선 성분 이외의 모든 성분이 0인 행렬을 의미한다.

이를 만드는 함수 또한 존재한다.

np.diag(v)

- 이 함수는 벡터 v를 주어진 행렬의 주대각선(k=0)에 배치한다.

- 주어진 문제에서는 대각선의 바로 아래에 배치하라고 하였으므로 k= -1

 

반응형