본문 바로가기

Minding's Programming/Numpy & Pandas

[Numpy exercise 100] 61번 ~ 70번 문제풀이

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

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

 

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

[Numpy exercise-100] 1번 ~ 30번 문제풀이 [Numpy exercise-100] 1번 ~ 30번 문제풀이 Data Scientist로의 역량 강화와 데이터 분석 분야 면접 준비를 위해 numpy를 다시 한번 복습하고자 Numpy excersise 100문..

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

 

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? (★★★)

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