본문 바로가기

Minding's Programming/Numpy & Pandas

[Numpy exercise 100] 31번 ~ 60번 문제풀이

728x90
반응형

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

 

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

Data Scientist로의 역량 강화와 데이터 분석 분야 면접 준비를 위해 numpy를 다시 한번 복습하고자 Numpy excersise 100문제를 풀기로 마음을 먹었다. https://github.com/rougier/numpy-100 GitHub - rougier/nu..

minding-deep-learning.tistory.com

 

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

 


31. How to ignore all numpy warnings (not recommended)? (★☆☆)

  • 모든 numpy 경고 메시지를 무시하는 방법 (권장되지 않는 방법)
  • np.seterr() 메서드 사용
    • 부동소수점 오류 처리 방법 설정
    • 나눗셈(divide), 오버플로우(over), 언더플로우(under), 유효하지않은(invalid) 소수점에 대해 각각 처리가능
    • {무시, 경고, 에러발생, 함수호출, 경고출력, log객체에 기록}으로 처리가능
    • numpy.seterr documentation

# all을 ignore로 설정하여 오류발생시 아무 행동도 취하지 않게 함 (Suicide mode)
defaults = np.seterr(all="ignore")
Z = np.ones(1) / 0

# 원래 상태로 되돌려 놓음
_ = np.seterr(**defaults)

>>>
# (에러메시지)

# 경고 표시하지 않도록 np.errstate(divede='ignore') 사용
with np.errstate(divide="ignore"):
    np.arange(3) / 0
    
>>>
# 아무것도 표시되지 않음

 

32. Is the following expressions true? (★☆☆)

  • 다음 표현식이 True인가?
  • np.emath.sprt(-1)은 1j로 표시되어 변수를 더 수학적으로 표현함 --> False
np.sqrt(-1) == np.emath.sqrt(-1)
print(np.sqrt(-1))
print(np.emath.sqrt(-1))

>>>
nan
1j

np.sqrt(-1) == np.emath.sqrt(-1)

>>>
False

 

33. How to get the dates of yesterday, today and tomorrow? (★☆☆)

  • 어제, 오늘, 내일의 날짜를 어떻게 알 수 있나요?
  • np.datetime64()메서드와 np.timedelta64() 메서드 사용
    • 오늘날짜 : np.datetime64('today', 'D')
    • 오늘을 기준으로 np.timedelta64()만큼의 연산을 통해 날짜 이동
    • np.timedelta64(1, 'D')라면 1일을 뜻한다. ('M'은 n달, 'Y'는 n년)
yesterday = np.datetime64('today', 'D') - np.timedelta64(1, 'D')
today = np.datetime64('today', 'D')
tomorrow = np.datetime64('today', 'D') + np.timedelta64(1, 'D')
next_year = np.datetime64('today', 'M') + np.timedelta64(1, 'M')

print(yesterday)
print(today)
print(tomorrow)
print(next_year)

>>>
2021-12-22
2021-12-23
2021-12-24
2022-01

 

34. How to get all the dates corresponding to the month of July 2016? (★★☆)

  • 2016년 7월에 해당하는 모든 날짜를 어떻게 구하나요?
  • np.arange()를 통해 해당 범위를 순서대로 나열하고, type을 datetime64[D]로 맞추어준다.
np.arange('2016-07', '2016-08', dtype='datetime64[D]')

>>>
array(['2016-07-01', '2016-07-02', '2016-07-03', '2016-07-04',
       '2016-07-05', '2016-07-06', '2016-07-07', '2016-07-08',
       '2016-07-09', '2016-07-10', '2016-07-11', '2016-07-12',
       '2016-07-13', '2016-07-14', '2016-07-15', '2016-07-16',
       '2016-07-17', '2016-07-18', '2016-07-19', '2016-07-20',
       '2016-07-21', '2016-07-22', '2016-07-23', '2016-07-24',
       '2016-07-25', '2016-07-26', '2016-07-27', '2016-07-28',
       '2016-07-29', '2016-07-30', '2016-07-31'], dtype='datetime64[D]')

 

35. How to compute ((A+B)*(-A/2)) in place (without copy)? (★★☆)

  • 복사 없이 (A+B)*(-A/2)를 계산하는 방법은 무엇입니까?
  • numpy의 연산메서드를 활용하여 복사없이 할당하는 방법으로 진행한다.
A = np.ones(3)*1
B = np.ones(3)*2
np.add(A,B,out=B) # A+B의 결과를 B에 할당해놓음
np.divide(A,2,out=A) # A/2의 결과를 A에 할당
np.negative(A,out=A) # -(A/2)를 A에 할당
np.multiply(A,B,out=A) # (A+B)*(-A/2)와 같은 결과
print(A)

>>>
[-1.5 -1.5 -1.5]

 

36. Extract the integer part of a random array of positive numbers using 4 different methods (★★☆)

  • 4가지 다른 방법을 사용하여 양의 무작위 원소 배열에서 정수 부분을 추출
  • 총 5가지 방법이 있음
    • 배열을 1로 나눈 나머지를 빼서 정수부분 구하기
    • np.floor()를 이용하여 내림
    • np.ceil()를 이용하여 올림
    • .astype(int)를 이용하여 데이터타입을 integer로 변환
    • np.trunc()를 이용하여 소숫자리를 자른 뒤 value 표시
z = np.random.uniform(0,10,10) # 양수의 무작위 원소 배열
print(z-z%1)
print(np.floor(z))
print(np.ceil(z))
print(z.astype(int))
print(np.trunc(z))

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

 

37. Create a 5x5 matrix with row values ranging from 0 to 4 (★★☆)

  • 0 ~ 4 범위의 행 값을 사용하여 5x5 행렬 만들기
  • np.zeros()로 5x5행렬 만든다음, np.arange(5) 행을 더해주기
z = np.zeros((5,5))
z += np.arange(5)
print(z)

>>>
[[0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]
 [0. 1. 2. 3. 4.]]

 

38. Consider a generator function that generates 10 integers and use it to build an array (★☆☆)

  • 10개의 정수를 생성하는 생성자 함수를 고려하고 이 함수를 사용하여 배열을 만들 수 있습니다.
  • python의 generator사용 (https://dojang.io/mod/page/view.php?id=2412 / generator 설명)
  • return 대신 yield사용 (return은 그 순간 함수종료, yield는 잠깐 대기한 뒤 다시 실행)
  • np.fromiter()는 순환할 수 있는 객체로 1차원 배열 생성하는 함수
# 제너레이터 함수 선언
def generate():
    for x in range(10):
        yield x
Z = np.fromiter(generate(),dtype=float,count=-1)
print(Z)

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

 

39. Create a vector of size 10 with values ranging from 0 to 1, both excluded (★★☆)

  • 0에서 1 사이의 값(둘 다 제외됨)으로 크기가 10인 벡터를 만듭니다.
  • np.linspace(endpoint=False)를 통해 0~1 사이의 값으로 배열을 만듦
    • endpoint=False는 마지막 숫자를 지정한 값이 아닌 다른 숫자로 변환
    • 인덱스 ([1:])로 첫번째 벡터 제외하여 10개 원소 배열로 변환
z = np.linspace(0,1,11, endpoint=False)
z[1:]

>>>
array([0.09090909, 0.18181818, 0.27272727, 0.36363636, 0.45454545,
       0.54545455, 0.63636364, 0.72727273, 0.81818182, 0.90909091])

 

40. Create a random vector of size 10 and sort it (★★☆)

  • 크기가 10인 랜덤 벡터를 만들어 정렬합니다.
  • .sort() 메서드 사용
z = np.random.random(10)
z.sort()
print(z)

>>>
[0.02910427 0.07655068 0.10788557 0.1092327  0.20020813 0.27126524
 0.30010546 0.36125959 0.3664528  0.7405005 ]

 

41. How to sum a small array faster than np.sum? (★★☆)

  • 어떻게 작은 배열을 np.sum보다 더 빨리 합칠 수 있을까요?
  • np.add.reduce() 사용
    • np.sum()의 경우 np.add.reduce()를 호출하여 사용하기 때문에 더 시간이 오래걸림
    • 작은 배열의 경우 np.add.reduce()가 더 빠름 (배열이 커지면 그 차이는 줄어듦)
A = np.arange(10)
print(np.add.reduce(A))

>>>
45

 

42. Consider two random array A and B, check if they are equal (★★☆)

  • 두 랜덤 배열 A와 B를 생각해보고, 그것들이 같은지 확인합니다.
  • 두 배열이 같은지 확인하는 방법
    • np.allclose()
    • np.array_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))

>>>
False
False

 

43. Make an array immutable (read-only) (★★☆)

  • 배열을 변경할 수 없도록 설정(읽기 전용)
  • .flags.writeable = False로 설정
z = np.zeros(10)
z.flags.writeable = False
# 값 변경 시도
z[0] = 1

>>>
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\AppData\Local\Temp/ipykernel_11440/4220960641.py in <module>
      2 z.flags.writeable = False
      3 # 값 변경 시도
----> 4 z[0] = 1

ValueError: assignment destination is read-only

 

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] #x와 y에 각각 0열, 1열 할당
r = np.sqrt(x**2+y**2) # 데카르트 좌표로 표현
p = np.arctan2(y,x) # 극좌표계표현
print(r)
print(p)

>>>
[0.17810757 1.24709363 0.6232125  0.95463695 0.73262977 0.26021825
 0.89916554 0.95345427 0.15387834 0.2886703 ]
[0.12488774 0.82709858 0.6238849  0.7235353  0.19461649 1.49374656
 0.98346331 0.06337392 1.07466376 0.66726093]

 

45. Create random vector of size 10 and replace the maximum value by 0 (★★☆)

  • 크기가 10인 랜덤 벡터를 생성하고 최대값을 찾아 0으로 바꿉니다.
  • np.argmax()로 해당위치(인덱스) 찾을 수 있음
z = np.random.random(10)
print(z)
# 최대값 찾아 0으로 바꿈
z[np.argmax(z)] = 0
print(z)

>>>
[0.97658021 0.30344542 0.21423567 0.94912617 0.39641269 0.00362352
 0.75071573 0.62233937 0.18350507 0.85558159]
[0.         0.30344542 0.21423567 0.94912617 0.39641269 0.00362352
 0.75071573 0.62233937 0.18350507 0.85558159]

 

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

  • [0,1]x[0,1] 영역을 커버하는 x 및 y 좌표를 갖는 구조화된 배열을 생성
  • 그리드포인트(x,y) 생성하여 함수 값 계산
  • np.meshgrid()를 통해 사각형 영역 구성하는 x축 및 y축 값을 인수로 받아 사각형 영역조합을 출력
# np.zeros()를 통해 (x,y)형태의 빈 array생성
z = np.zeros((5,5), [('x',float),('y',float)])
print(z)

>>>
[[(0., 0.) (0., 0.) (0., 0.) (0., 0.) (0., 0.)]
 [(0., 0.) (0., 0.) (0., 0.) (0., 0.) (0., 0.)]
 [(0., 0.) (0., 0.) (0., 0.) (0., 0.) (0., 0.)]
 [(0., 0.) (0., 0.) (0., 0.) (0., 0.) (0., 0.)]
 [(0., 0.) (0., 0.) (0., 0.) (0., 0.) (0., 0.)]]
# np.linspace()로 생성한 value들을 np.meshgrid를 통해 그리드포인트로 삽입
z['x'],z['y'] = np.meshgrid(np.linspace(0,1,5),np.linspace(0,1,5))
print(z)

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

추가 : meshgrid시각화

import matplotlib.pyplot as plt
plt.scatter(z['x'],z['y'])
plt.grid()

 

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

  • X, Y 두 배열이 주어지면, Cauchy matrix를 만드시오
  • 설명 필요...
해설 : 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를 계산한다.


출처: https://leechamin.tistory.com/53?category=827917 [참신러닝 (Fresh-Learning)]
X = np.arange(8)
Y = X + 0.5
C = 1.0 / np.subtract.outer(X, Y)
print(np.linalg.det(C))

>>>
3638.1636371179666

 

48. Print the minimum and maximum representable value for each numpy scalar type (★★☆)

  • 각 데이터 타입 별 표시할 수 있는 최소 및 최대 값을 출력하라
  • iinfo()는 int에 대한 정보
  • finfo()는 float에 대한 정보
  • .eps는 표현가능한 가장 작은 값을 반환
for dtype in [np.int8, np.int32, np.int64]:
    print(np.iinfo(dtype).min)
    print(np.iinfo(dtype).max)
    
>>>
-128
127
-2147483648
2147483647
-9223372036854775808
9223372036854775807
for dtype in [np.float32, np.float64]:
    print(np.finfo(dtype).min)
    print(np.finfo(dtype).max)
    print(np.finfo(dtype).eps)
    
>>>
-3.4028235e+38
3.4028235e+38
1.1920929e-07
-1.7976931348623157e+308
1.7976931348623157e+308
2.220446049250313e-16

 

49. How to print all the values of an array? (★★☆)

 

numpy.set_printoptions — NumPy v1.21 Manual

If True, always print floating point numbers using fixed point notation, in which case numbers equal to zero in the current precision will print as zero. If False, then scientific notation is used when absolute value of the smallest number is < 1e-4 or the

numpy.org

z = np.zeros((32,32))
print(z)

>>>
[[0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 ...
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]
 [0. 0. 0. ... 0. 0. 0.]]
# printoptions 설정 변경
np.set_printoptions(threshold=float("inf"))
print(z)

>>>
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 ...(생략)...
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
  0. 0. 0. 0. 0. 0. 0. 0.]]

 

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

  • 벡터에서 주어진 값에 가장 가까운 값을 찾는 방법은?
  • 주어진 값과 벡터의 각 요소를 뺀값 중 가장 작은값을 찾으면 됨
  • np.argmin() 메서드를 통해 찾기
# 주어진 값 = 7.3
num = 7.3
z = np.random.randint(0,10,10)
print(z)
# 주어진 값에서 가장 가까운 값 찾기
i = np.abs((z-num)).argmin()
# 가장 가까운값의 인덱스와 그 값 출력
print('인덱스:', i ,'/값:', z[i])

>>>
[2 9 8 2 6 9 7 3 8 4]
인덱스: 6 /값: 7

 

51. Create a structured array representing a position (x,y) and a color (r,g,b) (★★☆)

  • 위치(x,y) 및 색상(r,g,b)을 나타내는 구조화된 배열을 작성합니다.
  • np.zeros()를 통해 빈 배열 생성
z = np.zeros(10, [('position', [('x',float),
                                ('y',float)]), 
                  ('color', [('r',float),
                             ('g',float),
                             ('b',float)])])

print(z)

>>>
array([((0., 0.), (0., 0., 0.)), ((0., 0.), (0., 0., 0.)),
       ((0., 0.), (0., 0., 0.)), ((0., 0.), (0., 0., 0.)),
       ((0., 0.), (0., 0., 0.)), ((0., 0.), (0., 0., 0.)),
       ((0., 0.), (0., 0., 0.)), ((0., 0.), (0., 0., 0.)),
       ((0., 0.), (0., 0., 0.)), ((0., 0.), (0., 0., 0.))],
      dtype=[('position', [('x', '<f8'), ('y', '<f8')]), ('color', [('r', '<f8'), ('g', '<f8'), ('b', '<f8')])])

 

52. Consider a random vector with shape (100,2) representing coordinates, find point by point distances (★★☆)

  • 좌표를 나타내는 형태(100,2)를 갖는 랜덤 벡터를 고려합니다. 점 거리를 기준으로 점 찾기
  • 각 점(원소)을 기준으로 거리를 계산
Z = np.random.random((10,2))
# np.atleat_2d : 입력 배열을 2차원으로 받아들임
X,Y = np.atleast_2d(Z[:,0],Z[:,1])
D = np.sqrt( (X-X.T)**2 + (Y-Y.T)**2)
print(D)

>>>
[[0.      1.05731 0.13808 0.15902 0.78663 1.17945 0.31338 0.86942 0.88764
  0.4998 ]
 [1.05731 0.      1.02323 0.93292 0.57421 0.31058 0.87718 0.39681 0.27589
  0.63105]
 [0.13808 1.02323 0.      0.24039 0.83155 1.11108 0.40014 0.88755 0.8254
  0.42138]
 [0.15902 0.93292 0.24039 0.      0.62799 1.08516 0.1611  0.71679 0.79164
  0.44017]
 [0.78663 0.57421 0.83155 0.62799 0.      0.86181 0.49156 0.18184 0.64923
  0.65231]
 [1.17945 0.31058 1.11108 1.08516 0.86181 0.      1.07043 0.69383 0.29358
  0.68973]
 [0.31338 0.87718 0.40014 0.1611  0.49156 1.07043 0.      0.60575 0.78248
  0.49644]
 [0.86942 0.39681 0.88755 0.71679 0.18184 0.69383 0.60575 0.      0.51249
  0.62087]
 [0.88764 0.27589 0.8254  0.79164 0.64923 0.29358 0.78248 0.51249 0.
  0.40679]
 [0.4998  0.63105 0.42138 0.44017 0.65231 0.68973 0.49644 0.62087 0.40679
  0.     ]]

참고

plt.scatter(X,Y)
plt.grid()

 

53. How to convert a float (32 bits) array into an integer (32 bits) in place?

  • float(32 비트) 배열을 integer(32 비트)로 변환하는 방법은 무엇입니까?
  • astype(copy=False) 사용 (in place니까)
z = np.arange(10, dtype=np.float32)
print(z)
z = z.astype(np.int32, copy=False)
print(z)

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

 

54. How to read the following file? (★★☆)

  • 다음 파일을 어떻게 읽을 수 있습니까? (텍스트파일을 읽을 수 있는 방법)
  • np.genfromtxt()메서드 사용
    • np.genfromtxt(파일이름,delimeter=(구분점),dtype=(데이터타입))
    • 텍스트파일에서 데이터 로드하고 결측값을 지정값으로 바꿔줌(기본 -1)
1, 2, 3, 4, 5
6,  ,  , 7, 8
 ,  , 9,10,11
from io import StringIO

# fake file
s = StringIO("""1, 2, 3, 4, 5\n
                6,  ,  , 7, 8\n
                 ,  , 9,10,11\n""")

Z = np.genfromtxt(s,delimiter=",",dtype=np.int)
print(Z)

>>>
[[ 1  2  3  4  5]
 [ 6 -1 -1  7  8]
 [-1 -1  9 10 11]]

 

55. What is the equivalent of enumerate for numpy arrays? (★★☆)

  • Numpy Arrays에 대한 Enumerate와 같은 것은 무엇입니까?
  • 다차원 배열에서의 각 원소에 대한 인덱스 출력(enumerate)
    • np.ndenumerate()
    • np.ndindex(array.shape)
# ndenumerate() 사용
Z = np.arange(9).reshape(3,3)
print(Z)
for index, value in np.ndenumerate(Z):
    print(index, value)
    
>>>
[[0 1 2]
 [3 4 5]
 [6 7 8]]
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
(2, 0) 6
(2, 1) 7
(2, 2) 8
# ndindex() 사용
print(Z)
for index in np.ndindex(Z.shape):
    print(index, Z[index])
    
>>>
[[0 1 2]
 [3 4 5]
 [6 7 8]]
(0, 0) 0
(0, 1) 1
(0, 2) 2
(1, 0) 3
(1, 1) 4
(1, 2) 5
(2, 0) 6
(2, 1) 7
(2, 2) 8

 

56. Generate a generic 2D Gaussian-like array (★★☆)

  • 일반적인 가우시안 배열 생성
 

정규분포의 공식 유도 - 공돌이의 수학정리노트

 

angeloyeo.github.io

X, Y = np.meshgrid(np.linspace(-1,1,10), np.linspace(-1,1,10))
D = np.sqrt(X*X+Y*Y) # 
sigma, mu = 1.0, 0.0 # 가장 일반적인 정규분포
G = np.exp(-( (D-mu)**2 / ( 2.0 * sigma**2 ) ) )
print(G)

>>>
[[0.36788 0.44822 0.51979 0.57375 0.6028  0.6028  0.57375 0.51979 0.44822
  0.36788]
 [0.44822 0.54611 0.63331 0.69906 0.73444 0.73444 0.69906 0.63331 0.54611
  0.44822]
 [0.51979 0.63331 0.73444 0.81068 0.85172 0.85172 0.81068 0.73444 0.63331
  0.51979]
 [0.57375 0.69906 0.81068 0.89484 0.94014 0.94014 0.89484 0.81068 0.69906
  0.57375]
 [0.6028  0.73444 0.85172 0.94014 0.98773 0.98773 0.94014 0.85172 0.73444
  0.6028 ]
 [0.6028  0.73444 0.85172 0.94014 0.98773 0.98773 0.94014 0.85172 0.73444
  0.6028 ]
 [0.57375 0.69906 0.81068 0.89484 0.94014 0.94014 0.89484 0.81068 0.69906
  0.57375]
 [0.51979 0.63331 0.73444 0.81068 0.85172 0.85172 0.81068 0.73444 0.63331
  0.51979]
 [0.44822 0.54611 0.63331 0.69906 0.73444 0.73444 0.69906 0.63331 0.54611
  0.44822]
 [0.36788 0.44822 0.51979 0.57375 0.6028  0.6028  0.57375 0.51979 0.44822
  0.36788]]

 

57. How to randomly place p elements in a 2D array? (★★☆)

  • p개의 요소를 2D 배열에 무작위로 배치하는 방법은 무엇입니까?
  • np.put()을 통해 원소를 배치하고, np.random.choice()를 통해 범위 내 랜덤 인덱스를 생성한다.
p=3 # 3개의 요소 배치
z = np.zeros((10,10)) #10x10의 빈 배열 생성
np.put(z, np.random.choice(range(10*10), p, replace=False), 7) #10x10 인덱스 안에서 p(3)만큼을 랜덤으로 선택하여 7을 삽입
print(z)

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

 

58. Subtract the mean of each row of a matrix (★★☆)

  • 행렬의 각 행의 평균을 뺍니다.
  • .mean(axis와 keepdims 파라미터를 설정하여 실행)
    • axis=1 : 행 선택
    • keepdims : 차원 유지
x = np.random.rand(5, 10)
print(x)
y = x - x.mean(axis=1,keepdims=True)
print(y)

>>>
[[0.98297 0.71271 0.72411 0.13524 0.09461 0.40437 0.88661 0.09804 0.54232
  0.75652]
 [0.32256 0.28038 0.35677 0.25894 0.99396 0.12734 0.97516 0.7857  0.75767
  0.70912]
 [0.60073 0.26741 0.66347 0.68223 0.04645 0.74413 0.69911 0.1818  0.03398
  0.75448]
 [0.45262 0.34239 0.45225 0.55087 0.49777 0.18672 0.70726 0.71965 0.75054
  0.33596]
 [0.73445 0.56844 0.7033  0.94582 0.77205 0.99129 0.71552 0.99566 0.39958
  0.1503 ]]
  
[[ 0.44922  0.17896  0.19036 -0.39851 -0.43914 -0.12937  0.35286 -0.43571
   0.00857  0.22277]
 [-0.2342  -0.27638 -0.19999 -0.29782  0.4372  -0.42942  0.4184   0.22894
   0.20091  0.15236]
 [ 0.13335 -0.19997  0.19609  0.21485 -0.42093  0.27675  0.23173 -0.28558
  -0.4334   0.2871 ]
 [-0.04698 -0.15721 -0.04735  0.05127 -0.00184 -0.31288  0.20766  0.22005
   0.25094 -0.16365]
 [ 0.03681 -0.12921  0.00566  0.24818  0.07441  0.29365  0.01788  0.29802
  -0.29806 -0.54734]]

 

59. How to sort an array by the nth column? (★★☆)

  • n번째 열로 배열을 정렬하는 방법은 무엇입니까?
  • .argsort() 이용
    • z[z[:,1].argsort()] 는 행의 두번째(인덱스 1) 성분을 기준으로 정렬한다는 뜻
z = np.random.randint(0,10,(3,3))
print(z)
print(z[z[:,1].argsort()]) # 행의 두번째(index=1) 원소를 기준으로 정렬 (2, 1, 9 --> 1, 2, 9)

>>>
[[5 2 4]
 [5 1 5]
 [8 9 2]]
[[5 1 5]
 [5 2 4]
 [8 9 2]]

 

60. How to tell if a given 2D array has null columns? (★★☆)

  • 주어진 2D 배열에 null 열이 있는지 어떻게 알 수 있습니까?
  • .any() 사용하여 확인
  • int형에서 np.nan은 표현최소값으로 표현됨
Z = np.random.randint(0,3,(3,10))
print(Z)
Z[1] = np.nan
print(Z)
print((~Z.any(axis=0)).any())

>>>
[[2 2 0 0 0 1 1 0 1 2]
 [0 1 2 2 0 0 1 0 0 1]
 [1 1 0 1 1 0 1 0 2 2]]
 
[[          2           2           0           0           0           1
            1           0           1           2]
 [-2147483648 -2147483648 -2147483648 -2147483648 -2147483648 -2147483648
  -2147483648 -2147483648 -2147483648 -2147483648]
 [          1           1           0           1           1           0
            1           0           2           2]]
            
False
728x90