🐍Python/Numpy

[Numpy] Numpy 연습문제 11~20

728x90
반응형

11. Create a 3x3 identity matrix 

-> Z = np.eye(3,3)
    Z

A : array([[1., 0., 0.],
         [0., 1., 0.],
       [0., 0., 1.]])

해설 : np.eye를 통해 대각선 행렬성분이 1인 Identity matrix를 생성할 수 있다. (A,B)로 A행 B열로 구성할 수 있다.

12. Create a 3x3x3 array with random values

-> Z = np.random.random((3,3,3))
    Z

A : array([[[0.9849039 , 0.44041333, 0.41412264],
        [0.13367628, 0.99776952, 0.58991017],
        [0.01979863, 0.41352766, 0.00831818]],

       [[0.53746256, 0.49240489, 0.72275775],
        [0.9290293 , 0.91527371, 0.59300383],
        [0.06304409, 0.6235796 , 0.51371864]],

       [[0.14744497, 0.40863481, 0.00872342],
        [0.93286018, 0.02433692, 0.88904369],
        [0.61213566, 0.75593897, 0.73717661]]])

해설 : np.random.random(A,B,C) 총 A개, B개의 list C개의 Random Value 로 구성된다.

13. Create a 10x10 array with random values and find the minimum and maximum values 

-> Z = np.random.random((10,10))
    Z
    print("Z max :",Z.max(),"Z min :",Z.min())

A : Z max : 0.997166372857346 Z min : 0.0008415620064499141

해설 : np.random.random(10,10)으로 10개의 Random Value를 가지는 10개의 List를 만든다 그리고 객체에 .max / .min을 붙여 최댓값 / 최솟값을 얻는다.

14. Create a random vector of size 30 and find the mean value

-> Z = np.random.random(30)
   Z
   print(Z.mean())

A : 0.5915136780824467

해설 : Random Value 30를 생성하고 .mean( ) 을 붙여 Values의 평균을 구한다.

15. Create a 2d array with 1 on the border and 0 inside 

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

A : array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 0., 0., 0., 0., 0., 0., 0., 0., 1.],
       [1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])

해설 : 1로 둘러쌓인 0을 만들기 위해서 먼저 np.ones((10,10))을 통해 1로 구성되어 있는 10X10의 형태로 나타냈다. 그 후 [1:-1.1:-1]을 통해 각각의 0행과 0열을 제외한 나머지 성분을 0으로 변환하였다.

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

-> Z = np.ones((5,5))
    Z = np.pad(Z, pad_width=1,mode='constant',constant_values=0)
    Z

A : array([[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.]])

해설 : 이번엔 0으로 둘러쌓인 1을 구성하기 위해 안을 먼저 채워준다. 여기서는 np.pad를 통해 새로운 공간에 채워주도록 한다. Pad_width를 통해 가장자리를 채울 두께를 설정할 수 있다. 1로 했기에 1줄로만 구성되어 있다. Mode를 constant로 설정하고 그 value를 0으로 설정하여 채운다.

* 앞선 문제처럼 np.pad를 쓰지 않고 아래와 같이 풀 수도 있다.
    Z = np.zeros((7,7))
    Z[1:-1,1:-1] = 1
   Z

17. What is the result of the following expression? 

-> print(0*np.nan)
    print(np.nan==np.nan)
    print(np.inf > np.nan)
    print(np.nan - np.nan)
    print(np.nan in set([np.nan]))
    print(0.3 == 3 * 0.1)

A : nan
    False
    False
    nan
    True
    False

해설 : inf(infinity)는 무한대를 표현하고, nan(not a number)은 정의할 수 없는 숫자를 나타낸다.
3.0 * 0.1은 0.3으로 나오지 않고 0.300000000004로 출력된다. 이는 부동소수점에 의한 오차를 나타낸다.

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

-> Z = np.diag(1+np.arange(4),k=-1)
    print(Z)

A : [[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]]

해설 : 대각성분 이외의 모든 성분이 모두 0인 n차 정방행렬인 ‘대각행렬’을 만드는 것이다. np.arange(4) -> [0,1,2,3]에 + 1 하여 [1,2,3,4]로 바꿔준다. k=-1로 설정함으로써 (0,0)시작이 아닌 (1,0)에서 대각으로 출력된다.

19. Create a 8x8 matrix and fill it with a checkerboard pattern

-> Z = np.zeros((8,8))
    Z[1::2,::2] = 1
    Z[::2,1::2] = 1
    print(Z)

A : [[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.zeros((8,8))로 0으로 채워진 8X8을 만든다.
Z[A::B]는 A로 시작하는 index에서부터 그리고 B만큼의 step size를 갖고 slicing한다.
따라서 [1::2,::2]는 0행을 건너뛰고 1행부터 step size= 2만큼을 slicing하는 것이다.
그리고 동시에 0열부터 step size = 2만큼을 갖고 slicing 한다.
이를 통해 checkboard pattern을 구사할 수 있다.
[start : stop : step]

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

-> Z = np.unravel_index(100,(6,7,8))
    print(Z)

A : (1, 5, 4)

해설 : np.unrabel_index(indices, dims,order=‘C’)이다.
정의는 다음과 같다 “플랫 인덱스 또는 플랫 인덱스 배열을 좌표 배열의 튜플로 변환한다.

C = 행 주요 / F = 열 주요


728x90
반응형