【问题标题】:Improving efficiency of creating multidimensional array from function提高从函数创建多维数组的效率
【发布时间】:2020-09-22 04:11:38
【问题描述】:

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

我有一些数据存储在一个二维数组中,我们称之为z。我有两个独立的二维数组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

但从这一点开始,我认为我所做的一切都是解决这个问题的一种非常糟糕的方法。理想情况下,我只想输入笛卡尔数组并取回极坐标数组,但这似乎不适用于我定义的函数(这可能是因为我已将输入类型隐式定义为双精度,但我希望 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 转换回它们的原始数组形状。

有没有更简单有效的方法来创建二维数组rtheta?是否可以通过更改我的 polar 函数定义或使用列表理解来创建它们?

感谢您的任何回复。

【问题讨论】:

  • math.atan2 似乎不在这里。您正在使用 numpy。
  • 你为什么不直接使用接受的答案呢?那个使用 numpy,而你也在使用 numpy。
  • 尝试使用np.arctan2np.degrees 实现完全矢量化。
  • 可能重复:1234——都是因为 OP 试图将一个 numpy 数组传递给 math.* 函数。
  • 作为后续问题,是否有任何特殊情况可以使用math 而不是numpyThis 建议您应该始终使用 numpy 但我不明白为什么 math 甚至存在,如果 numpy 基本上总是优于它。

标签: python arrays multidimensional-array list-comprehension


【解决方案1】:

是的,好的,这是一个非常容易解决的问题。感谢@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)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-03
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多