[Numpy exercise 100] 1번 ~ 30번 문제풀이

2021. 12. 23. 17:10·Minding's Programming/Numpy & Pandas
728x90
반응형

 

Data Scientist로의 역량 강화와 데이터 분석 분야 면접 준비를 위해 numpy를 다시 한번 복습하고자

Numpy excersise 100문제를 풀기로 마음을 먹었다.

 

https://github.com/rougier/numpy-100

 

GitHub - rougier/numpy-100: 100 numpy exercises (with solutions)

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

github.com

 

100개의 문제들은 위 링크에서 볼 수 있고, ipynb 파일을 통해 해답과 힌트를 제공한다. (이런 좋은 분이 계시다니...)

문제들을 풀며 내 나름대로의 정리와 해석을 달면서 공부했다.

 

 


문제풀이

 

1. Import the numpy package under the name np (★☆☆)

import numpy as np

 

2. Print the numpy version and the configuration (★☆☆)

print(np.__version__)

>>>
1.19.5

 

3. Create a null vector of size 10 (★☆☆)

  • null vector는 zero vector를 뜻함
z = np.zeros(10)
print(z)

>>>
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

 

4. How to find the memory size of any array (★☆☆)

  • array의 메모리 사이즈 찾는 방법
  • numpy.ndarray.nbytes를 사용해서도 간단하게 구할 수 있다.
print(z.nbytes)
print(z.size * z.itemsize)
print(np.prod(z.shape) * z.itemsize)

>>>
80
80
80

 

5. How to get the documentation of the numpy add function from the command line? (★☆☆)

  • numpy의 add function에 대한 설명문서를 불러오는 방법
!python -c "import numpy; numpy.info(numpy.add)"

>>>
add(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])

Add arguments element-wise.

Parameters
----------
(생략)

 

6. Create a null vector of size 10 but the fifth value which is 1 (★☆☆)

  • size가 10인 null vector를 만들고 5번째 원소는 1로 만들기
z = np.zeros(10)
z[4] = 1
print(z)

>>>
[0. 0. 0. 0. 1. 0. 0. 0. 0. 0.]

 

7. Create a vector with values ranging from 10 to 49 (★☆☆)

  • 값이 10에서 49를 원소로 가지고 있는 벡터 만들기
x = np.arange(10,50)
print(x)

>>>
[10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49]

 

8. Reverse a vector (first element becomes last) (★☆☆)

  • 위 배열의 원소를 뒤집는 문제
  • 인덱스를 이용해서 해결 가능
  • np.flip()을 통해 해결 가능
# 인덱스로 해결
print(x[::-1])

# np.flip() 사용
print(np.flip(x))

>>>
[49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26
 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10]
[49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26
 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10]

 

9. Create a 3x3 matrix with values ranging from 0 to 8 (★☆☆)

  • 0부터 8을 원소로 가지는 3 x 3의 행렬을 만들어라
matrix = np.arange(0,9).reshape([3,3])
print(matrix)

>>>
[[0 1 2]
 [3 4 5]
 [6 7 8]]

 

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

  • [1,2,0,0,4,0]에서 0이 아닌 요소의 인덱스 찾기
  • 조건에 맞는 값의 인덱스 찾아주는 np.where() 메서드 사용하여 해결
  • 리스트는 array로 바꿔주어야 함
  • np.nonzero() 메서드 사용하여 해결가능
# np.where() 사용
f = np.array([1,2,0,0,4,0])
np.where(f != 0)

# np.nonzero() 사용
np.nonzero(f)

>>>
(array([0, 1, 4], dtype=int64),)

 

11. Create a 3x3 identity matrix (★☆☆)

  • 3 x 3의 항등행렬을 만들어라
  • np.identity() 메서드와 np.eye() 메서드로 만들 수 있음
  • identity()는 정방단위행렬(N x N), eye()는 대각행렬 (N x M 가능)
# np.identity() 사용
np.identity(3)

# np.eye() 사용
np.eye(3)

>>>
array([[1., 0., 0.],
       [0., 1., 0.],
       [0., 0., 1.]])

 

12. Create a 3x3x3 array with random values (★☆☆)

  • 무작위 원소를 가진 3x3x3의 array를 만들어라
  • np.random.random() 이용하여 무작위 원소 적용
rand = np.random.random([3,3,3])
rand

>>>
array([[[0.92842722, 0.92574424, 0.07725618],
        [0.75726719, 0.75362092, 0.22836732],
        [0.12551308, 0.9106576 , 0.17518133]],

       [[0.06029213, 0.99286814, 0.80926844],
        [0.42243376, 0.95335137, 0.18474632],
        [0.04488715, 0.89688706, 0.37775391]],

       [[0.94077574, 0.91818125, 0.35818829],
        [0.76793943, 0.12810186, 0.99508023],
        [0.4833759 , 0.59272653, 0.01835418]]])

 

13. Create a 10x10 array with random values and find the minimum and maximum values (★☆☆)

  • 10x10의 무작위 원소를 가진 array를 만들고 최솟값과 최댓값을 찾아라.
  • max()와 min()사용
rand = np.random.random([10,10])
print(rand.max())
print(rand.min())

>>>
0.9991753105525707
0.0009901146637728564

 

14. Create a random vector of size 30 and find the mean value (★☆☆)

  • size가 30인 무작위 벡터를 만들고 평균값을 구하라
  • mean() 사용
rand = np.random.random(30)
print(rand.mean())

 

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

  • 테두리의 원소가 1이고 안쪽 원소가 0인 2차원 배열을 만들어라
  • 1로 채워진 배열 만들고 인덱스 활용해 안쪽을 0으로 채움
arr = np.ones((3,5))
arr

>>>
array([[1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.],
       [1., 1., 1., 1., 1.]])
arr[1,1:4] = 0
arr

>>>
array([[1., 1., 1., 1., 1.],
       [1., 0., 0., 0., 1.],
       [1., 1., 1., 1., 1.]])

 

16. How to add a border (filled with 0's) around an existing array? (★☆☆)

  • 기존 배열에 (0으로 채워진) 새로운 테두리를 추가하는 방법은?
  • np.pad()로 채울 수 있음
  • 팬시 인덱싱으로도 해결가능하다.
Z = np.ones((5,5))
Z = np.pad(Z, pad_width=1, mode='constant', constant_values=0)
print(Z)

# Using fancy indexing
Z[:, [0, -1]] = 0
Z[[0, -1], :] = 0
print(Z)

>>>
[[0. 0. 0. 0. 0. 0. 0.]
 [0. 1. 1. 1. 1. 1. 0.]
 [0. 1. 1. 1. 1. 1. 0.]
 [0. 1. 1. 1. 1. 1. 0.]
 [0. 1. 1. 1. 1. 1. 0.]
 [0. 1. 1. 1. 1. 1. 0.]
 [0. 0. 0. 0. 0. 0. 0.]]

 

17. What is the result of the following expression? (★☆☆)

  • 다음 식의 결과는?
0 * np.nan
np.nan == np.nan
np.inf > np.nan
np.nan - np.nan
np.nan in set([np.nan])
0.3 == 3 * 0.1
  1. nan
  2. False
  3. False
  4. nan
  5. True
  6. False

1~4 : nan은 '정의되지 않은 수'이기 때문에 비교하거나 연산할 수 없다.

5 : np.nan은 np.nan의 집합 내에 속한다.

6 : 3.0 * 0.1은 0.3으로 나오지 않고 0.300000000004로 출력된다. 이는 부동소수점에 의한 오차를 나타낸다.

(6번 설명출처: https://leechamin.tistory.com/31 [참신러닝 (Fresh-Learning)])

 

 

18. Create a 5x5 matrix with values 1,2,3,4 just below the diagonal (★☆☆)

  • 대각선 바로 아래에 값 1,2,3,4가 있는 5x5 행렬 만들기
  • np.diag()은 주어진 원소로 대각행렬을 만들어줌. k를 기준으로 대각선 아래/위에 삽입 가능
np.diag([1,2,3,4], k=-1)

>>>
array([[0, 0, 0, 0, 0],
       [1, 0, 0, 0, 0],
       [0, 2, 0, 0, 0],
       [0, 0, 3, 0, 0],
       [0, 0, 0, 4, 0]])

 

19. Create a 8x8 matrix and fill it with a checkerboard pattern (★☆☆)

  • 8x8 매트릭스를 만들고 체커보드 패턴으로 채웁니다.
  • 팬시인덱싱을 이용해 해결
  • [A::B]는 A부터 B의 step만큼 건너뛰며 slicing 한다는 뜻
  • np.tile로도 해결가능
# 팬시인덱싱 사용
matrix = np.zeros((8,8))
matrix[::2, 1::2] = 1
matrix[1::2, ::2] = 1
print(matrix)

# np.tile() 사용
matrix = np.tile(np.array([[0, 1], [1, 0]]), (4, 4))
print(matrix)

>>>
[[0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]
 [0. 1. 0. 1. 0. 1. 0. 1.]
 [1. 0. 1. 0. 1. 0. 1. 0.]]
 
 [[0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]] # np.tile() 사용하면 정수로 나온다.

 

20. Consider a (6,7,8) shape array, what is the index (x,y,z) of the 100th element? (★☆☆)

  • (6,7,8) 모양 배열을 고려하면 100 번째 요소의 인덱스 (x, y, z)는 무엇입니까?
  • np.unravel_index : 플랫 인덱스 또는 플랫 인덱스 배열을 튜플 좌표 배열로 변환합니다.
z = np.unravel_index(99,(6,7,8)) #100번째 인덱스 = 99
print(z)

>>>
(1, 5, 3)

 

21. Create a checkerboard 8x8 matrix using the tile function (★☆☆)

  • 타일 함수를 사용하여 체커보드 8x8 매트릭스 만들기
matrix = np.tile(np.array([[0, 1], [1, 0]]), (4, 4))
print(matrix)

>>>
[[0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]
 [0 1 0 1 0 1 0 1]
 [1 0 1 0 1 0 1 0]]

 

22. Normalize a 5x5 random matrix (★☆☆)

  • 5x5 랜덤 행렬 정규화
  • Z = (X – 평균) / (표준편차) (Z-score nomarlization)
rand = np.random.random((5,5))
norm = (rand - rand.mean())/rand.std()
print(norm)

>>>
[[ 1.4755198  -1.18436877 -1.15214335  1.60875073 -0.01677941]
 [-0.91157011 -0.53974214 -0.76255593 -0.37546198 -0.67763248]
 [ 1.66806845  1.19832749 -0.67279504  1.07368752  0.18071735]
 [ 1.22837962 -0.52696318 -0.65502861 -1.23114673 -0.69306837]
 [-0.98135635 -1.00695036  0.68384938  0.9001969   1.37006556]]

 

23. Create a custom dtype that describes a color as four unsigned bytes (RGBA) (★☆☆)

  • 색상을 4개의 부호 없는 바이트(RGBA)로 설명하는 사용자 지정 dtype 만들기
  • data type의 축약형 중 u는 부호없는 정수로, 각각의 색깔에 해당됨
color = np.dtype([("r", np.ubyte),
                  ("g", np.ubyte),
                  ("b", np.ubyte),
                  ("a", np.ubyte)])
                  
color

>>>
dtype([('r', 'u1'), ('g', 'u1'), ('b', 'u1'), ('a', 'u1')])

 

24. Multiply a 5x3 matrix by a 3x2 matrix (real matrix product) (★☆☆)

  • 5x3 행렬에 3x2 행렬(실제 행렬 곱)을 곱합니다.
  • np.dot() 또는 @연산자 사용
arr1 = np.random.random((5,3))
arr2 = np.random.random((3,2))
np.dot(arr1, arr2)

# 또는
arr1@arr2

>>>
array([[0.38825541, 0.28442516],
       [0.39528622, 0.14339797],
       [1.10552462, 0.34293362],
       [0.93457422, 0.42392023],
       [0.32585785, 0.1383503 ]])

 

25. Given a 1D array, negate all elements which are between 3 and 8, in place. (★☆☆)

  • 1차원 배열에서 3에서 8사이 값을 음수화하여라
z = np.arange(11)
z[(2<z) & (z<9)] *= -1
z

>>>
array([ 0,  1,  2, -3, -4, -5, -6, -7, -8,  9, 10])

 

26. What is the output of the following script? (★☆☆)

  • 다음 스크립트의 출력은 어떻게 됩니까?
# Author: Jake VanderPlas

print(sum(range(5),-1))
from numpy import *
print(sum(range(5),-1))
print(sum(range(5),-1))
from numpy import *
print(sum(range(5),-1))

>>>
9
10

 

27. Consider an integer vector Z, which of these expressions are legal? (★☆☆)

  • 정수 벡터 Z를 생각해보십시오.이 표현식 중 어느 것이 합법적입니까?
Z**Z
2 << Z >> 2
Z <- Z
1j*Z
Z/1/1
Z<Z>Z
Z = np.arange(10)
print(Z**Z)
print(2 << Z >> 2)
print(Z <- Z)
print(1j*Z)
print(Z/1/1)
# print(Z<Z>Z) --> ilegal(에러발생)

 

28. What are the result of the following expressions? (★☆☆)

  • 다음 표현의 결과는 무엇입니까?
  • array 나누기는 불가하다. 하지만 // : 나누기 연산 후 소수점 이하의 수를 버리고, 정수 부분의 수만 구하는 것은 가능하다. (출처: https://leechamin.tistory.com/43?category=827917 [참신러닝 (Fresh-Learning)])
np.array(0) / np.array(0)
np.array(0) // np.array(0)
np.array([np.nan]).astype(int).astype(float)
print(np.array(0) / np.array(0))
print(np.array(0) // np.array(0))
print(np.array([np.nan]).astype(int).astype(float))

>>>
nan
0
[-2.14748365e+09]

 

29. How to round away from zero a float array ? (★☆☆)

  • 부동 배열 0에서 반올림하는 방법?
  • 절댓값(abs)으로 바꾸고 np.ceil()을 통해 올림한다. (반올림 X)
Z = np.random.uniform(-10,+10,10)
print(np.copysign(np.ceil(np.abs(Z)), Z))

>>>
[ 7.  7.  8. -9. -3.  7. -2.  5.  5. -7.]

 

30. How to find common values between two arrays? (★☆☆)

  • 두 배열 사이의 공통 값을 찾는 방법은 무엇입니까?
  • np.intersect1d()를 이용하여 공통원소 찾음
arr1 = np.random.randint(0,10,10)
arr2 = np.random.randint(0,10,10)
print(arr1)
print(arr2)
print(np.intersect1d(arr1, arr2))

>>>
[4 5 1 0 7 1 5 6 8 9]
[2 4 4 5 2 7 5 2 0 3]
[0 4 5 7]
728x90

'Minding's Programming > Numpy & Pandas' 카테고리의 다른 글

[Numpy Exercise 100] 91번 ~ 100번 문제풀이  (0) 2022.01.03
[Numpy exercise 100] 81번 ~ 90번 문제풀이  (0) 2021.12.30
[Numpy exercise 100] 71번 ~ 80번 문제풀이  (0) 2021.12.28
[Numpy exercise 100] 61번 ~ 70번 문제풀이  (0) 2021.12.27
[Numpy exercise 100] 31번 ~ 60번 문제풀이  (0) 2021.12.24
'Minding's Programming/Numpy & Pandas' 카테고리의 다른 글
  • [Numpy exercise 100] 81번 ~ 90번 문제풀이
  • [Numpy exercise 100] 71번 ~ 80번 문제풀이
  • [Numpy exercise 100] 61번 ~ 70번 문제풀이
  • [Numpy exercise 100] 31번 ~ 60번 문제풀이
Minding
Minding
  • Minding
    Today's Minding
    Minding
  • 전체
    오늘
    어제
    • 울고넘는 딥러닝 (278)
      • Minding's Baseball (57)
        • MLB Statcast (29)
        • 머신러닝으로 홈런왕 예측하기 (3)
        • 야구칼럼 (12)
        • 야구 규칙, 용어 (1)
        • 2022-23 질롱 코리아 (8)
        • 류현진 등판경기 (4)
      • Minding's Programming (185)
        • 프로그래머스 코딩테스트 (21)
        • Knowledge (44)
        • Numpy & Pandas (6)
        • Excel (3)
        • Git (1)
        • Pygame (11)
        • CV (3)
        • Tensorflow tutorial (4)
        • Kaggle and Dacon (4)
        • 에러 코드 (8)
        • FastAPI (8)
        • Airflow (29)
        • Crawling (6)
        • Django (14)
        • AWS (18)
        • Spark (5)
      • Minding's Reading (30)
        • 머신러닝 딥러닝에 필요한 기초 수학 with 파이.. (2)
        • 칼만필터는 어렵지 않아 (11)
        • 밑바닥부터 시작하는 딥러닝 (6)
        • 메이저리그 야구 통계학 2e (8)
        • 논문읽기 (2)
        • 빅데이터를 지탱하는 기술 (1)
      • Minding's Life (5)
        • 주식 (4)
        • 각종 소식 (1)
  • 블로그 메뉴

    • 홈
    • Baseball
    • Programming
    • Reading
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    pygame
    mlb stats api
    코딩테스트
    머신러닝
    칼만필터는어렵지않아python
    딥러닝
    질롱코리아
    Python
    django python
    메이저리그
    KBO
    게임개발
    데이터분석
    넘파이
    MLB
    KalmanFilter
    파이게임
    칼만필터는어렵지않아파이썬
    데이터 엔지니어
    FastAPI
    AWS
    프로그래머스
    에어플로우
    파이썬게임개발
    django
    칼만필터는어렵지않아
    칼만필터
    Airflow
    야구
    파이썬
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
Minding
[Numpy exercise 100] 1번 ~ 30번 문제풀이
상단으로

티스토리툴바