728x90
반응형
[Numpy exercise-100] 1번 ~ 30번 문제풀이
https://github.com/rougier/numpy-100
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 (★★☆)
- 데카르트 좌표를 나타내는 임의의 10x2 행렬을 고려하여 극좌표로 변환합니다.
- 데카르트 좌표(https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%B9%B4%EB%A5%B4%ED%8A%B8_%EC%A2%8C%ED%91%9C%EA%B3%84)
- 극좌표계 (https://ko.wikipedia.org/wiki/%EA%B7%B9%EC%A2%8C%ED%91%9C%EA%B3%84)
- 데카르트좌표와 극좌표계에 대한 추가 공부 필요..
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? (★★☆)
- 배열의 모든 값을 인쇄하는 방법은 무엇입니까?
- np.set_printoptions(threshold=float("inf"))로 설정한다.
- threshold는 요약을 하는 배열 요소의 총 수를 나타냄 float("inf")로 설정하면 요약없이 사용한다는 뜻
- 참고 : https://numpy.org/doc/stable/reference/generated/numpy.set_printoptions.html
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 (★★☆)
- 일반적인 가우시안 배열 생성
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
'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] 1번 ~ 30번 문제풀이 (0) | 2021.12.23 |