问题描述
这将是一个非常基本的问题,但我在两件事上有些卡住。
我有一些数据存储在2D数组中,我们称之为z
。我有两个单独的2D数组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
但是从现在开始,我认为我正在做的每一件事都是解决这个问题的非常糟糕的方法。理想情况下,我只想馈入笛卡尔数组并返回极坐标数组,但这似乎不适用于我定义的函数(这可能是因为我将输入类型隐式定义为double,但是我希望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
转换回其原始数组形状。
我是否有一种更轻松,更有效的方法来创建2D数组r
和theta
?是否可以通过更改我的polar
函数定义或使用列表理解来创建它们?
感谢您的答复。
解决方法
是的,好的,所以这很简单。感谢@ user202729和@Igor Raush。就像这样简单:
def polar(x,y)
r = np.hypot(x,y)
theta = np.arctan2(y,x)
return r,theta
.....
r,theta = polar(nxp,nyp)
很抱歉这个问题很愚蠢,但感谢您的回答。