【问题标题】:Smart way to convert polars to Cartesian coordinates with numpy使用 numpy 将极坐标转换为笛卡尔坐标的智能方法
【发布时间】:2014-09-04 11:10:55
【问题描述】:

我有一个以通常方式从极坐标生成的笛卡尔坐标数组:

for k in range(0, Phi_term):
    for j in range(0, R_term):
        X[k,j] = R[j]*np.cos(phi[k]);
        Y[k,j] = R[j]*np.sin(phi[k]);

问题是这样一个数组的第零个元素对应极圆的原点。我想要一个相同元素的数组,但从右上角开始。例如,当前数组中的元素分布如下(上半部分):

11 10 9 6 7 8
14 13 12 3 4 5
17 16 15 0 1 2

(想象它是一个圆圈)。我想要的是从第零个元素开始的网格:

0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17

虽然保留了值,即初始数组的第 11 个元素的值现在是新数组的第 0 个元素的值。

numpy 中是否有任何聪明的方法来执行这样的转换?

【问题讨论】:

  • 对我来说,不清楚你想要达到什么目的......你能发布一个你期望的输入和输出的例子吗?
  • 你真的想要笛卡尔坐标,还是想要描述顺序的极坐标?

标签: math numpy geometry coordinates polar-coordinates


【解决方案1】:
def quasiCartesianOrder(arr, R_term, Phi_term):
       # deal with odd phi count by starting from top of top spike.
       rhsOddOffset = 0
       if Phi_term % 2 == 1:
          rhsOddOffset = R_term
          for r in xrange(0, R_term):
             yield (Phi_term + 1)/2 * R_term - r - 1

       # 'rectangular' section, starting down 11 o'clock and up 1 o'clock.
       phiBaseLeft = Phi_term / 2 + rhsOddOffset/R_term
       phiBaseRight = Phi_term / 2
       for phiLine in xrange(0, Phi_term / 2):
          # down 11
          base = (phiBaseLeft + phiLine) * R_term - 1
          for idx in xrange(base + R_term, base, -1):
             yield idx

          # up 1
          base = (phiBaseRight - phiLine ) * R_term
          for idx in xrange(base - R_term, base):
             yield idx

行为:

        11
        10
        9
14 13 12 6 7 8
17 16 15 3 4 5
20 19 18 0 1 2

变成

        0
        1
        2
 3 4  5  6  7  8
 9 10 11 12 13 14
15 16 17 18 19 20

结果

11 10 9 14 13 12 6 7 8 17 16 15 3 4 5 20 19 18 0 1 2

样式是一个生成器,所以你可以迭代。如果您只想要索引本身,请使用返回的生成器调用 list,您应该可以将其与 numpy 的索引数组一起使用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多