提高从函数创建多维数组的效率

问题描述

这将是一个非常基本的问题,但我在两件事上有些卡住。

我有一些数据存储在2D数组中,我们称之为z我有两个单独的2D数组nxpnyp,它们保存z中每个元素的映射信息。 nxpnyp因此目前持有笛卡尔坐标,我想将其转换为极坐标。 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

因此,我现在正在实现将所有内容转换为一维列表,并迭代填充rtheta。例如

nxp_1D = nxp.ravel()
nyp_1D = nyp.ravel()

for counter,value in enumerate(nxp_1D):
    r,theta = polar(value,nyp_1D[counter])

这种精确的实现是有缺陷的,因为它仅返回rtheta的单个值,而不是填充值列表。

更一般地说,尽管出于某些原因,我真的不喜欢这种方法。对于这个问题,它似乎是一个非常费力的解决方案。最重要的是,我以后可能要进行一些contourf绘制,这将需要将rtheta转换回其原始数组形状。

我是否有一种更轻松,更有效的方法来创建2D数组rtheta?是否可以通过更改我的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)

很抱歉这个问题很愚蠢,但感谢您的回答。