2016-07-03 4 views
4

이미지에 놓일 좌표 배열을 생성하려고합니다. 사용중인 이미지는 640x480 픽셀 프레임입니다. 모든 배열을 xy 포인트를 사용하고 싶습니다. 나는 시각화 및 나중에 사용하기 위해이 점들 각각에 작은 원을 그려서이 좌표를 OpenCV circle 함수에 입력 할 수있는 형식으로 만들려고합니다. 아래는 내가 지금까지 가지고 무엇을 :Python Numpy가 특정 범위의 X 및 Y 값에 대한 좌표를 생성합니다.

Ypts = np.arange(5, 480, 5) 
Xpts = np.arange(5, 640, 5) 

내가

[pts]= np.vstack([Xpts, Ypts]).T 

성공하지
coordinate = [] 
for x in range(Xpts.size): 
    for y in range(Ypts.size): 
     coordinate.append((x, y)) 

, I 좌표를 얻을 출력을 사용하여 시도 대신 포인트 [0, 0], [0, 1], [0, 2], ...입니다 XptsYpts의 값과 관련됩니다.

Xpts = [5, 10, 15, 20, 25, 30, 35] 
Ypts = [5, 10, 15] 

하고 내가 대답 그대로에 도착하는 것을 시도하고있다 :

Points = [[5, 5], 
    [5, 10], 
    [5, 15], 
    [10, 5], 
    [10, 10], 
    [10, 15], 
    [15, 5], 
    [15, 10], 
    ......, 
    [35, 15]] 
+0

['itertools.product'] (https://docs.python.org/2/library/itertools.html#itertools.product)를 사용하십시오. – BrenBarn

답변

3

당신은을 사용할 수 있습니다 기본적으로 제공된 목록의 가능한 모든 조합을 반환합니다. 예제 코드를 참조하십시오

import numpy as np 
import itertools 

Xpts=[5, 10, 15, 20, 25, 30, 35] 
Ypts=[5, 10, 15] 

Points = np.array(list(itertools.product(Xpts, Ypts))) 

이 다음 반환합니다, 당신은뿐만 아니라 np.meshgrid을 사용할 수 있습니다

array([[ 5, 5], 
     [ 5, 10], 
     [ 5, 15], 
     [10, 5], 
     [10, 10], 
     [10, 15], 
     [15, 5], 
     [15, 10], 
     [15, 15], 
     [20, 5], 
     [20, 10], 
     [20, 15], 
     [25, 5], 
     [25, 10], 
     [25, 15], 
     [30, 5], 
     [30, 10], 
     [30, 15], 
     [35, 5], 
     [35, 10], 
     [35, 15]]) 
4

당신은 수를이 작은 규모에

는 x와 y 배열이 무엇의 예입니다 NumPy와의 mgrid 모든 가능한 조합을 생성합니다

>>> py, px = np.mgrid[5:480:5, 5:640:5] 
>>> points = np.c_[py.ravel(), px.ravel()] 
>>> points 
array([[ 5, 5], 
     [ 5, 10], 
     [ 5, 15], 
     ..., 
     [475, 625], 
     [475, 630], 
     [475, 635]]) 
+1

'py, px = np.mgrid [5 : 640 : 5 : 480 : 5]'가 샘플의 예상 출력으로 진행되지 않아야합니까? – Divakar

+0

@Divakar 예, 당신이 옳다고 생각합니다! 나는 이미지를'height x width'라고 생각하는 경향이있다. (파이썬의 C 순서도 마찬가지다.) 나는 OP가 포인트를 원한다면 약간 irrelevanf일지도 모른다. 그리고 그 순서는 중요하지 않다. –

2

this solution에 의해 성능에 초점을 맞춘 영감을 -

X2D,Y2D = np.meshgrid(Ypts,Xpts) 
out = np.column_stack((Y2D.ravel(),X2D.ravel())) 

샘플 실행 -

In [39]: Xpts=np.array([5, 10, 15, 20, 25, 30, 35]) 
    ...: Ypts=np.array([3, 6, 9]) 
    ...: 

In [40]: X2D,Y2D = np.meshgrid(Ypts,Xpts) 

In [41]: np.column_stack((Y2D.ravel(),X2D.ravel())) 
Out[41]: 
array([[ 5, 3], 
     [ 5, 6], 
     [ 5, 9], 
     ...... 
     [35, 6], 
     [35, 9]]) 
012 3,516,

런타임 테스트 평소처럼

나는 문제를 해결하기 위해 지금까지 나와있는 벡터화 된 접근 방식에 대한 타이밍을 나열하고있다. 따라서 여기에 나열된 접근 방식에 대한 기여도는 해당 저자에게 돌아갑니다. 함수로 표시

접근 :

def itertools_based(): 
    Ypts = np.arange(5, 480, 5) 
    Xpts = np.arange(5, 640, 5) 
    return np.array(list(itertools.product(Xpts, Ypts))) 

def c__based(): 
    py, px = np.mgrid[5:640:5,5:480:5] 
    return np.c_[py.ravel(), px.ravel()] 

def meshgrid_based(): 
    Ypts = np.arange(5, 480, 5) 
    Xpts = np.arange(5, 640, 5) 
    X2D,Y2D = np.meshgrid(Ypts,Xpts) 
    return np.column_stack((Y2D.ravel(),X2D.ravel())) 

마지막 타임을 확인하고 :

In [111]: %timeit itertools_based() 
    ...: %timeit c__based() 
    ...: %timeit meshgrid_based() 
    ...: 
100 loops, best of 3: 9.16 ms per loop 
1000 loops, best of 3: 380 µs per loop 
10000 loops, best of 3: 198 µs per loop 

In [112]: np.allclose(itertools_based(),c__based()) 
Out[112]: True 

In [113]: np.allclose(itertools_based(),meshgrid_based()) 
Out[113]: True 
2

사람들은 이미 numpy.mgrid와 itertools을 제안했다. 그것을 써.

그러나 교육을 위해 Python은 "목록 이해"라는 강력한 개념을 제공합니다. 다음을 실행하여 데카르트의 제품을 얻을 수 있습니다 [a,b]

[(a,b) for a in range(5, 485, 5) for b in range(5, 645, 5)] 

변경 (a,b) 당신이 튜플의 목록을하지 않으려면.

관련 문제