복붙노트

[PYTHON] 어떻게 numpy 배열을 "확장"할 수 있습니까?

PYTHON

어떻게 numpy 배열을 "확장"할 수 있습니까?

shape (h, w)의 배열을 n의 배수로 스케일링하여 모양 배열 (h * n, w * n)을 얻고 싶습니다.

2x2 배열이 있다고 가정 해보십시오.

array([[1, 1],
       [0, 1]])

배열을 4x4가되도록 축척하고 싶습니다.

array([[1, 1, 1, 1],
       [1, 1, 1, 1],
       [0, 0, 1, 1],
       [0, 0, 1, 1]])

즉, 원래 배열의 각 셀 값이 결과 배열의 4 개의 해당 셀로 복사됩니다. 임의의 배열 크기와 스케일링 인자를 가정 할 때, 가장 효율적인 방법은 무엇입니까?

해결법

  1. ==============================

    1.Kronecker 제품인 numpy.kron을 사용해야합니다.

    Kronecker 제품인 numpy.kron을 사용해야합니다.

    import numpy as np
    a = np.array([[1, 1],
                  [0, 1]])
    n = 2
    np.kron(a, np.ones((n,n)))
    

    당신이 원하는 것을 제공합니다 :

    array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [0, 0, 1, 1],
           [0, 0, 1, 1]])
    
  2. ==============================

    2.반복을 사용할 수 있습니다.

    반복을 사용할 수 있습니다.

    In [6]: a.repeat(2,axis=0).repeat(2,axis=1)
    Out[6]: 
    array([[1, 1, 1, 1],
           [1, 1, 1, 1],
           [0, 0, 1, 1],
           [0, 0, 1, 1]])
    

    두 작업을 하나로 결합하는 깔끔한 방법이 있는지 나는 잘 모르겠습니다.

  3. ==============================

    3.효과적으로 확장하려면 다음 접근 방식을 사용합니다. 작품은 반복보다 5 배 빠르고 크론보다 10 배 빠릅니다. 먼저 스케일 된 배열을 내부에 채우기 위해 타겟 배열을 초기화합니다. 몇 사이클을 이기기 위해 조각을 미리 정의하십시오.

    효과적으로 확장하려면 다음 접근 방식을 사용합니다. 작품은 반복보다 5 배 빠르고 크론보다 10 배 빠릅니다. 먼저 스케일 된 배열을 내부에 채우기 위해 타겟 배열을 초기화합니다. 몇 사이클을 이기기 위해 조각을 미리 정의하십시오.

    K = 2   # scale factor
    a_x = numpy.zeros((h * K, w *K), dtype = a.dtype)   # upscaled array
    Y = a_x.shape[0]
    X = a_x.shape[1]
    myslices = []
    for y in range(0, K) :
        for x in range(0, K) :
            s = slice(y,Y,K), slice(x,X,K)
            myslices.append(s)
    

    이제이 함수는 스케일을 수행합니다.

    def scale(A, B, slices):        # fill A with B through slices
        for s in slices: A[s] = B
    

    또는 한 가지 기능으로 간단하게 동일한 것 :

    def scale(A, B, k):     # fill A with B scaled by k
        Y = A.shape[0]
        X = A.shape[1]
        for y in range(0, k):
            for x in range(0, k):
                A[y:Y:k, x:X:k] = B
    
  4. ==============================

    4.scipy.misc.imresize는 이미지 크기를 조절할 수 있습니다. 또한 numpy 배열의 크기를 조절하는 데 사용할 수 있습니다.

    scipy.misc.imresize는 이미지 크기를 조절할 수 있습니다. 또한 numpy 배열의 크기를 조절하는 데 사용할 수 있습니다.

    #!/usr/bin/env python
    
    import numpy as np
    import scipy.misc
    
    def scale_array(x, new_size):
        min_el = np.min(x)
        max_el = np.max(x)
        y = scipy.misc.imresize(x, new_size, mode='L', interp='nearest')
        y = y / 255 * (max_el - min_el) + min_el
        return y
    
    x = np.array([[1, 1],
                  [0, 1]])
    n = 2
    new_size = n * np.array(x.shape)
    y = scale_array(x, new_size)
    print(y)
    
  5. from https://stackoverflow.com/questions/7525214/how-to-scale-a-numpy-array by cc-by-sa and MIT license