【发布时间】:2020-09-22 04:11:38
【问题描述】:
这将是一个非常基本的问题,但我有点卡在两件事上。
我有一些数据存储在一个二维数组中,我们称之为z。我有两个独立的二维数组nxp 和nyp,它们保存z 中每个元素的映射信息。 nxp 和 nyp 因此目前持有笛卡尔坐标,我想将其转换为极坐标。
Following this,我已定义 polar 将给定的 (x,y) 转换为 (r, theta) 为:
import numpy as np
import math
def polar(x, y):
'''
Args:
x (double): x-coordinate.
y (double): y-coordinate.
Returns:
r, theta (in degrees).
'''
r = np.hypot(x, y)
theta = math.degrees(math.atan2(y, x))
return r, theta
但从这一点开始,我认为我所做的一切都是解决这个问题的一种非常糟糕的方法。理想情况下,我只想输入笛卡尔数组并取回极坐标数组,但这似乎不适用于我定义的函数(这可能是因为我已将输入类型隐式定义为双精度,但我希望 python 会是可以在这里超载)。
r, theta = polar(nxp, nyp)
回溯是:
.... in polar
theta = math.degrees(math.atan2(y,x))
TypeError: only size-1 arrays can be converted to Python scalars
所以我现在正在实现将所有内容转换为一维列表并迭代以填充 r 和 theta。例如
nxp_1D = nxp.ravel()
nyp_1D = nyp.ravel()
for counter, value in enumerate(nxp_1D):
r, theta = polar(value, nyp_1D[counter])
这个确切的实现是错误的,因为它只为r 和theta 返回一个值,而不是填充值列表。
更一般地说,尽管出于几个原因我真的不喜欢这种方法。对于这个问题,它看起来是一个非常严厉的解决方案。最重要的是,我可能想稍后再做一些contourf 绘图,这需要将r 和theta 转换回它们的原始数组形状。
有没有更简单有效的方法来创建二维数组r 和theta?是否可以通过更改我的 polar 函数定义或使用列表理解来创建它们?
感谢您的任何回复。
【问题讨论】:
-
math.atan2似乎不在这里。您正在使用 numpy。 -
你为什么不直接使用接受的答案呢?那个使用 numpy,而你也在使用 numpy。
-
尝试使用
np.arctan2和np.degrees实现完全矢量化。 -
作为后续问题,是否有任何特殊情况可以使用
math而不是numpy? This 建议您应该始终使用numpy但我不明白为什么math甚至存在,如果numpy基本上总是优于它。
标签: python arrays multidimensional-array list-comprehension