[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.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.반복을 사용할 수 있습니다.
반복을 사용할 수 있습니다.
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.효과적으로 확장하려면 다음 접근 방식을 사용합니다. 작품은 반복보다 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.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)
from https://stackoverflow.com/questions/7525214/how-to-scale-a-numpy-array by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] NumPy 대 다중 처리 및 mmap (0) | 2018.10.27 |
---|---|
[PYTHON] 큰 문서에서 전자 메일 하위 문자열 추출 (0) | 2018.10.27 |
[PYTHON] Python + Selenium + PhantomJS에서 PDF로 렌더링 (0) | 2018.10.27 |
[PYTHON] 사용자 정의 메트릭을 사용하여 Sklearn kNN 사용 (0) | 2018.10.27 |
[PYTHON] PANDAS의 SQL과 유사한 창 기능 : Python Pandas Dataframe의 행 번호 매기기 (0) | 2018.10.27 |