【问题标题】:Mapping a point into a numpy array将一个点映射到一个 numpy 数组中
【发布时间】:2020-07-19 22:16:15
【问题描述】:

这可能是一个简单的问题。

我想获取具有 x,y 笛卡尔坐标的点的 numpy 索引。我应该使用int()floor()ceil(),还是一个都不用?

numpy数组表示一个gridmap,笛卡尔坐标系的(0,0)位置应该在numpy数组的中心。

我找到了一张显示我的问题的图片:

【问题讨论】:

  • 我应该使用 int()、floor()、ceil(),还是都不使用? 坐标是浮动的吗?请澄清您的问题。
  • 是的,笛卡尔坐标是浮点数。网格可以有一个分辨率,例如每个单元格 0.05 m。

标签: python numpy graphics mapping drawing


【解决方案1】:

假设您在 5x5 笛卡尔平面上工作。你可以决定用 numpy 来表示你的飞机,如下所示:

>>> x = np.arange(-12,13)
>>> x.shape = (5,5)
>>> x
array([[-12, -11, -10,  -9,  -8],
       [ -7,  -6,  -5,  -4,  -3],
       [ -2,  -1,   0,   1,   2],
       [  3,   4,   5,   6,   7],
       [  8,   9,  10,  11,  12]])

但您的问题是您的原点不在 (0,0):

>>> x[0,0]
-12

因为所有数组都从 0 开始。要“修复”索引引用,只要在引用二维数组时将数组索引偏移一维范围的一半即可:

>>> x[math.floor(0 - 5/2),math.floor(0 - 5/2)]
0

同样:

>>> x[math.floor(-2 - 5/2),math.floor(-2 - 5/2)]
-12

你可以像这样引用你的数组:

>>> for i in range(-2,3):
...     for j in range(-2,3):
...             ix = math.floor(i - 5/2)
...             jy = math.floor(j - 5/2)
...             x[ix,jy] = x[ix,jy] * 5
...             print("{0:>5}".format(x[ix,jy]),end="")
...     print()
...
  -60  -55  -50  -45  -40
  -35  -30  -25  -20  -15
  -10   -5    0    5   10
   15   20   25   30   35
   40   45   50   55   60

这显然是一个人为的例子。

【讨论】:

  • 好的,谢谢。如果我在网格上使用分辨率?例如每个单元格 0.5 米。我只是将 x,y 除以 0.5,然后减去偏移量并使用 floor 对吗?
  • 如果您希望每个单元格代表 0.5 米,那么您将乘以 0.5。例如,在 x 轴上距离原点 5 个像元将相当于 5*0.5 = 2.5 米。如果我正确理解你的意思。例如,如果每个单元格等于 0.5 米,则以米为单位的距离将使用 x[ix,jy] = math.sqrt((i*0.5)**2.0 + (j*0.5)**2.0)
  • 我的意思是如果我有一个 10 x 10 米的笛卡尔坐标系。还有一个大小为 10/0.5x10/0.5(网格分辨率为 0.5)的 numpy 数组。现在我想将米中的点(2.3,-5.4)映射到网格中。首先,我必须将 2.3 和 -5.4 除以 0.5,对吗?
  • 我明白了。是的,然后发言。然后每个维度将有 20 个段,您的点将被解析为半米桶。所以,(地板(2.3/0.5),地板(5.4/0.5))=(4,10)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-18
  • 2021-01-29
  • 2016-05-16
  • 1970-01-01
  • 1970-01-01
  • 2015-07-14
  • 2017-05-26
相关资源
最近更新 更多