2016-07-03 20 views
4

イメージ上にある座標の配列を生成しようとしています。 使用されている画像は、640×480ピクセルのフレームです。私は使用したいxyのすべての配列を作ることができました。私は、これらの各点で小さな円をプロットして、可視化と後で使用するために、OpenCVサークル関数に入力できる形式に座標を取得しようとしています。以下は、私がこれまで持っているものです: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)) 

を使用してみましたが、私がコーディネートのために得る出力は[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))) 

これは以下を返します。

this solutionでとパフォーマンスに焦点を当てたインスピレーションを受け
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'と考える傾向があります(PythonのC順序付けと同じです)。 OPがポイントを求めているだけで、オーダーが重要でないならば、それは少しばかりかもしれないと思います。 –

2

、あなたにもnp.meshgridを使用することができます -

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いつものように

ランタイムテスト

私はこの問題を解決するために、これまで記載されているベクトル化のアプローチのタイミングを一覧表示しています。したがって、ここに記載されているアプローチの功績はそれぞれの著者に帰されます。機能としてリスト

アプローチ:

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) for a in range(5, 485, 5) for b in range(5, 645, 5)] 

変更(a,b)[a,b]にあなたはタプルのリストを望んでいない場合。

関連する問題