728x90
반응형
[Numpy exercise 100] 1번 ~ 30번 문제풀이
[Numpy exercise 100] 31번 ~ 60번 문제풀이
https://github.com/rougier/numpy-100
60번부터는 별 2개 ~ 별 3개의 비교적 고난이도 문제가 나오기 때문에 이해하는 데 시간이 걸릴 것이라고 생각되어
10문제씩 풀며 이해하고 넘어갈 예정이다.
61. Find the nearest value from a given value in an array (★★☆)
- 배열의 지정된 값에서 가장 가까운 값 찾기
- .flat()으로 array를 vector형태로 펴준 뒤 벡터의 방법과 같이 최소값 구해줌
Z = np.random.uniform(0,1,10)
z = 0.5
print(Z)
m = Z.flat[np.abs(Z-z).argmin()]
print(m)
>>>
[0.22690611 0.73244938 0.42902479 0.19474847 0.11260596 0.62687306
0.70982974 0.76366036 0.15354412 0.18160317]
0.4290247857509055
62. Considering two arrays with shape (1,3) and (3,1), how to compute their sum using an iterator? (★★☆)
- 모양 (1,3)과 (3,1)의 두 배열을 고려할 때 iterator를 사용하여 합계를 계산하는 방법은 무엇입니까?
- np.nditer 공식문서 : https://numpy.org/doc/stable/reference/generated/numpy.nditer.html
- np.nditer는 요소 하나하나마다 접근하여 설정값에 따른 결과를 알려주는 함수 (배열 반복)
A = np.arange(3).reshape(1,3)
B = np.arange(3).reshape(3,1)
print(A, B)
it = np.nditer([A,B,None])
for x,y,z in it: z[...] = x+y
print(it.operands[2])
>>>
[[0 1 2]] [[0]
[1]
[2]]
[[0 1 2]
[1 2 3]
[2 3 4]]
63. Create an array class that has a name attribute (★★☆)
- 이름 특성이 있는 배열 클래스 만들기
- NamedArray라는 class를 선언하여 array에 이름이 붙을 수 있게 설정
class NamedArray(np.ndarray):
def __new__(cls, array, name="no name"):
obj = np.asarray(array).view(cls)
obj.name = name
return obj
def __array_finalize__(self, obj):
if obj is None: return
self.info = getattr(obj, 'name', "no name")
Z = NamedArray(np.arange(10), "range_10")
print (Z.name)
>>>
range_10
64. Consider a given vector, how to add 1 to each element indexed by a second vector (be careful with repeated indices)? (★★★)
- 주어진 벡터를 고려하라. 두 번째 벡터로 색인화된 각 요소에 1을 추가하는 방법을 고려하라.
- 인덱스를 나타내는 벡터인 a가 있을 때 (ex. 6은 Z의 7번째 원소를 뜻함) 인덱스의 개수를 세어서 Z에 더해줌
- np.add.at()을 통해 해결
Z = np.ones(10)
a = np.random.randint(0,len(Z),20)
np.add.at(Z,a,1)
print(a)
print(Z)
>>>
[0 6 8 3 1 1 2 3 9 1 9 2 5 1 9 7 5 0 1 3]
[3. 6. 3. 4. 1. 3. 2. 2. 2. 4.]
65. How to accumulate elements of a vector (X) to an array (F) based on an index list (I)? (★★★)
- 색인 목록(I)을 기반으로 벡터(X)의 요소를 배열(F)에 삽입하는 방법
- X의 원소들을 I에 나와있는 인덱스에 각각 삽입하는 방법
- np.bincount()를 이용
X = [1,2,3,4,5,6]
I = [1,4,5,6,7,8]
F = np.bincount(I,X)
print(F)
>>>
[0. 1. 0. 0. 2. 3. 4. 5. 6.]
66. Considering a (w,h,3) image of (dtype=ubyte), compute the number of unique colors (★★☆)
- (dtype=ubyte)의 (w,h,3) 이미지를 고려하여 고유한 색상의 수를 계산한다.
- 3차원 RGB 이미지의 고유 색상의 개수 계산
img = np.random.randint(0,2,(16,16,3)).astype(np.ubyte)
F = img[...,0]*(256*256) + img[...,1]*256 + img[...,2]
print(len(np.unique(F)))
>>>
8
67. Considering a four dimensions array, how to get sum over the last two axis at once? (★★★)
- 4차원 배열을 고려할 때, 마지막 두 축에 대한 합을 한 번에 얻는 방법은 무엇입니까?
- (2,2,3,3)의 뒤에서 두번째까지의 축(3,3)에 대한 합들을 구하는 방법
- row와 col이 고정된 채로 채널 방향으로 합산함
z = np.random.randint(0, 10, (2,2,3,3))
print(z)
z.sum(axis=(-2,-1))
>>>
[[[[0 4 3]
[8 7 6]
[0 7 3]]
[[6 6 8]
[9 3 7]
[6 4 0]]]
[[[4 4 1]
[4 2 8]
[8 0 6]]
[[4 8 7]
[1 3 7]
[1 5 9]]]]
array([[38, 49],
[37, 45]])
68. Considering a one-dimensional vector D, how to compute means of subsets of D using a vector S of same size describing subset indices? (★★★)
- 1차원 벡터 D를 고려했을 때, 부분집합 지수를 기술하는 동일한 크기의 벡터 S를 사용하여 D의 부분집합의 평균을 계산하는 방법은 무엇인가?
- D_sums : S 인덱스를 고려하여 더하돼 D를 가중치(실제 더하는 숫자)로 하여 더함
- Pandas의 gropuby()를 이용하면 더 쉽게 해결가능
D_sums
>>>
array([3.26787395, 3.20313736, 5.73453595, 6.5774351 , 3.60056041,
6.18891079, 2.40678115, 6.4380369 , 6.03578166, 6.88186015])
D_counts
>>>
array([ 7, 6, 11, 12, 9, 14, 7, 12, 11, 11], dtype=int64)
# numpy의 bincount 이용
D = np.random.uniform(0,1,100)
S = np.random.randint(0,10,100)
D_sums = np.bincount(S, weights=D)
D_counts = np.bincount(S)
D_means = D_sums / D_counts
print(D_means)
>>>
[0.46683914 0.53385623 0.52132145 0.54811959 0.40006227 0.44206506
0.34382588 0.53650308 0.54870742 0.62562365]
# pandas의 groupby 이용
import pandas as pd
print(pd.Series(D).groupby(S).mean())
>>>
0 0.466839
1 0.533856
2 0.521321
3 0.548120
4 0.400062
5 0.442065
6 0.343826
7 0.536503
8 0.548707
9 0.625624
dtype: float64
69. How to get the diagonal of a dot product? (★★★)
- 곱 계산을 한 array의 대각선에 위치한 원소들만 뽑아내기
- np.diag를 통해 배열의 대각행렬을 만들기
- np.einsum()을 통해 해결하기 (설명 : https://ita9naiwa.github.io/numeric%20calculation/2018/11/10/Einsum.html)
A = np.random.uniform(0,1,(5,5))
B = np.random.uniform(0,1,(5,5))
# print(A)
# print(B)
print(np.dot(A,B))
# 느림
np.diag(np.dot(A,B))
# 가장 빠른 버젼
np.einsum('ij,ji->i',A,B)
>>>
[[1.32076382 1.45993875 1.14379092 0.95426732 1.78433494]
[1.54519023 1.60359615 1.59356053 1.41450901 2.2970631 ]
[0.74821021 1.0644123 0.70781144 0.87293559 1.24068129]
[1.54656724 2.0705222 1.68433296 1.36645552 2.38825871]
[1.274722 0.66600021 1.01874923 0.55718571 0.91588162]]
array([1.32076382, 1.60359615, 0.70781144, 1.36645552, 0.91588162])
70. Consider the vector [1, 2, 3, 4, 5], how to build a new vector with 3 consecutive zeros interleaved between each value? (★★★)
- 벡터 [1, 2, 3, 4, 5]를 고려하면 각 값 사이에 3 개의 연속 0이 삽입 된 새로운 벡터를 만드는 방법은 무엇입니까?
- 벡터 사이의 0이 3개씩 들어간 것을 가정하여 zero배열을 만들어 놓은 뒤 1~5를 일정간격으로 삽입
Z = np.array([1,2,3,4,5])
nz = 3
Z0 = np.zeros(len(Z) + (len(Z)-1)*(nz))
print(Z0)
# [::n] 처음부터 끝까지 n간격으로
Z0[::nz+1] = Z
print(Z0)
>>>
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[1. 0. 0. 0. 2. 0. 0. 0. 3. 0. 0. 0. 4. 0. 0. 0. 5.]
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] 31번 ~ 60번 문제풀이 (0) | 2021.12.24 |
[Numpy exercise 100] 1번 ~ 30번 문제풀이 (0) | 2021.12.23 |