🐍Python/Numpy

[Numpy] Numpy 연습문제 41~50

728x90
반응형

41. How to sum a small array faster than np.sum? 

-> A = np.arange(10)
    np.add.reduce(A)

A : 45

42. Consider two random array A and B, check if they are equal

-> A = np.random.randint(0,2,5)
    B = np.random.randint(0,2,5)
    print(np.allclose(A,B))
    print(np.array_equal(A,B))
  
A : False
False

해설 : np.random.randint(~부터,~까지,갯수)로 random한 수를 만든다. 그리고 np.allclose / np.array_equal로 이 둘이 같은지 확인한다. 
  

43. Make an array immutable (read-only)

-> Z = np.zeros(10)
    Z.flags.writeable = False
    Z[0]= 1

A : ValueError: assignment destination is read-only

해설 : Z.flags.writeable = False로 설정함으로써 변수를 변경하는 것을 막았다. 

44. Consider a random 10x2 matrix representing cartesian coordinates, convert them to polar coordinates

-> Z = np.random.random((10,2))
    X,Y = Z[:,0], Z[:,1]
    R = np.sqrt(X**2+Y**2)
    P = np.arctan2(Y,X)
    print(R)
    print(P)

A : [1.01434065 0.99973581 0.87746031 0.83094067 0.87575542 0.63995035
1.05394707 0.61888326 0.80955953 1.03479779]
[0.37580005 1.06439612 0.64049511 0.20915833 1.38573605 0.97596043
1.09371614 0.21938327 1.44770291 1.24857978]

해설 : 먼저 X, Y에 각각의 0열, 1열을 할당한다.  
그리고 Cartesian coordinates √X^2+Y^2을 실행한다.
그리고 극좌표계(polar)를 나타내기 위해 arctan2를 사용한다. 

45. Create random vector of size 10 and replace the maximum value by 0

-> Z = np.random.random(10)
    Z[Z.argmax()] = 0
    print(Z)

A: [0.64485038 0.22565932 0.51117196 0.29435492 0.37009494 0.38939236
0.2915144  0.35736192 0.57608598 0.38200352]
[0.         0.22565932 0.51117196 0.29435492 0.37009494 0.38939236
0.2915144  0.35736192 0.57608598 0.38200352]
0.64485 -> 0으로 바뀜

해설 : np.random.random(10)으로 난수 10개를 생성하고 Z.argmax()를 통해 max값의 위치를 먼저 찾았다. 그리고 그 값으로 Z를 indexing하여 0을 바꾸었다.  

46. Create a structured array with x and y coordinates covering the [0,1]x[0,1] area 

-> Z = np.zeros((5,5),[('x',float),('y',float)])
    Z['x'],Z['y'] = np.meshgrid(np.linspace(0,1,5),np.linspace(0,1,5))
    print(Z)

A : [[(0.  , 0.  ) (0.25, 0.  ) (0.5 , 0.  ) (0.75, 0.  ) (1.  , 0.  )]
[(0.  , 0.25) (0.25, 0.25) (0.5 , 0.25) (0.75, 0.25) (1.  , 0.25)]
[(0.  , 0.5 ) (0.25, 0.5 ) (0.5 , 0.5 ) (0.75, 0.5 ) (1.  , 0.5 )]
[(0.  , 0.75) (0.25, 0.75) (0.5 , 0.75) (0.75, 0.75) (1.  , 0.75)]
[(0.  , 1.  ) (0.25, 1.  ) (0.5 , 1.  ) (0.75, 1.  ) (1.  , 1.  )]]

해설 : 변수가 2개인 2차원 함수의 그래프를 그리거나 표를 작성하려면 2차원 영역에 대한 (x,y) 좌표값 쌍 즉, 그리드 포인트(grid point)를 생성하여 각 좌표에 대한 함수 값을 계산해야 한다. 예를 들어 x, y 라는 두 변수를 가진 함수에서 x가 0부터 2까지, y가 0부터 4까지의 사각형 영역에서 변화하는 과정을 보고 싶다면 이 사각형 영역 안의 다음과 같은 그리드 포인트들에 대해 함수를 계산해야 한다.
(x,y)=(0,0),(0,1),(0,2),(0,3),(0,4),(1,0),⋯(2,4)
 Meshgrid를 통해 사각형 영역을 구성하는 가로축의 점들과 세로축의 점을 나타내는 두 벡터를 인수로 받아서 이 사각형 영역을 이루는 조합을 출력한다. 결과는 그리드 포인트의 x 값만을 표시하는 행렬과 y 값만을 표시하는 행렬 두 개로 분리하여 출력한다.


47. Given two arrays, X and Y, construct the Cauchy matrix C (Cij =1/(xi - yj))

-> X = np.arange(8)
    Y = X + 0.5    
    C = 1.0 / np.subtract.outer(X,Y)
    print(np.linalg.det(C))

A : 3638.1636371179666

해설 : np.subtract(A,B) 는 A-B를 의미한다. 
np.subtract.outer(A,B)를 하면 
[[A1-B1 A1-B2 A1-B3]
[ A2-B1 A2-B2 A2-B3]
[ A3-B1  A3-B2 A3-B3]]
으로 각각의 i,j에 해당하는 성분을 추출하여 뺀다.
Linalg는 linearAlgebra를 말한다. det는 matrix의 determinant of an array를 계산한다.

48. Print the minimum and maximum representable value for each numpy scalar type 

-> for dtype in [np.int8,np.int32,np.int64]:
    print(np.iinfo(dtype).min)
    print(np.iinfo(dtype).max)
for dtype in [np.float32,np.float64]:
    print(np.finfo(dtype).min)
    print(np.finfo(dtype).max)
    print(np.finfo(dtype).eps)

A : -128
127
-2147483648
2147483647
-9223372036854775808
9223372036854775807
-3.4028235e+38
3.4028235e+38
1.1920929e-07
-1.7976931348623157e+308
1.7976931348623157e+308
2.220446049250313e-16

해설 : iinfo()는 int에 대한 정보를 / finfo()는 float에 대한 정보를 준다. Eps는 표현가능한 가장 작은 값을 돌려준다.

49. How to print all the values of an array?

-> np.set_printoptions(threshold=np.nan)
    Z = np.zeros((16,16))
    Z

A : set_printoptions로 print options를 설정할 수 있다. 굉장히 많은 option을 조정할 수 있다 .
이를 참고하면 된다. 
Threshold는 전체가 아닌 요약을 하는 배열 요소의 총 수를 나타낸다


50. How to find the closest value (to a given scalar) in a vector?

->Z = np.random.randint(0,10,10)
    print(Z)
    Z[Z.argmin()]

A : [6 8 3 9 3 5 7 4 1 9]
8
( 8 번째가 가장 작다 (0부터 셈))

해설 : argmin()은 배열속 가장 작은 값의 index를 알려준다. ( <-> argmax )






728x90
반응형