首页 > 解决方案 > 笨拙数组中的while循环等效函数/片段

问题描述

我有一个要转换的函数,以便可以与笨拙的数组 1 一起使用。

由于已知原因,其后的函数用于浮点数但不适用于笨拙的数组。

def Phi_mpi_pi(x):
    kPI=(3.14159265)
    kTWOPI = 2 * kPI

    #while ((x.any() >= kPI).any()): x = x - kTWOPI;                                                                                                                                                        
    #while ((x.any() < -kPI).any()): x = x + kTWOPI;                                                                                                                                                        
    while ((x >= kPI)): x = x - kTWOPI;
    while ((x < -kPI)): x = x + kTWOPI;
    return x;

我试图将其转换为 numpy/awkward 兼容的形式,新功能看起来像

def Phi_mpi_pi(x):
    kPI=numpy.array(3.14159265)
    kPI = kPI.repeat(len(x))
    kTWOPI = 2 * kPI
    while ((x >= kPI)): x = x - kTWOPI;
    while ((x < -kPI)): x = x + kTWOPI;
    return x;

这个函数永远停留在while循环中,我找不到调试它的方法。

该函数的任务是将值保持在 +- kPI 之间的尴尬数组中,但此逻辑没有给出所需的结果。

例如

x=ak.Array([[0.7999999999999998, 1.0, -1.3], [], [-1.4], [-1.8000000000000003, -6.1000000000000005, -1.6000000000000005], [-4.6]])

但是 ((x < -kPI)) 这给出了所需的输出。

>>> ak.to_list(x <= -kPI)
    [[False, False, False], [], [False], [False, True, False], [True]]

但不是功能

基于while循环的逻辑,所需的输出应该是b/w +- kPI,有什么可以使用的直接或建议吗?

标签: pythonawkward-array

解决方案


我不太明白你想要什么,但这至少可以帮助你调试:

import numpy
import awkward1 as ak

def Phi_mpi_pi(x):
    kPI=numpy.array(3.14159265)
    kPI = kPI.repeat(len(x))
    kTWOPI = 2 * kPI
    print("kPI =", kPI)
    print("kTWOPI =", kTWOPI)
    while ((x >= kPI)):
        print(x)
        x = x - kTWOPI
    while ((x < -kPI)):
        print(x)
        x = x + kTWOPI
    return x

x=ak.Array([[0.7999999999999998, 1.0, -1.3], [], [-1.4], [-1.8000000000000003, -6.1000000000000005, -1.6000000000000005], [-4.6]])

print(Phi_mpi_pi(x))

评论太长了,所以我将其发布为答案,尽管它当然并不直接代表解决方案。


推荐阅读