Python Numpy为特定范围内的X和Y值生成坐标

2024-07-05 09:10:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图生成一个坐标数组,它将位于图像上。 使用的图像为640x480像素帧。我已经能够将我希望使用的所有xy点组成一个数组。我试图在这些点上绘制小圆圈,只是为了可视化和以后使用,所以我试图将坐标转换成可以输入OpenCV circle函数的形式。以下是我到目前为止得到的信息:

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的值相关的点

在较小的范围内,这是x和y阵列的示例:

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]]

Tags: in图像coordinateforsize可视化np绘制
3条回答

可以使用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]])

^{}的启发并注重性能,您还可以使用^{}-

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]])

运行时测试

像往常一样,我列出了迄今为止为解决这个问题而列出的向量化方法的时间安排。因此,这里列出的方法归功于各自的作者

作为功能列出的方法:

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

您可以使用itertools.product,它基本上将返回所提供列表的所有可能组合。有关示例,请参见此代码:

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)))

这将返回以下内容:

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]])

相关问题 更多 >