while 循环等价于 function/snippet 笨拙的数组
while loop equivalent function/snippet in awkward array
我有一个函数,我想转换它以便我可以使用笨拙的数组 1。
后面的函数用于 float 但由于已知原因不适用于笨拙的数组。
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,有没有可以使用的直截了当的东西或建议?
我不太明白你想要什么,但这至少可以帮助你调试:
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))
评论太长了,所以我 post 它作为一个答案,当然它并不直接代表解决方案。
好的,知道了。您想将 x 中的每个标量值(都是角度)调整到 -π 和 π 之间。
你可以这样做:
def Phi_mpi_pi(x):
y = numpy.add(x, numpy.pi)
y = numpy.mod(y, 2*numpy.pi)
y = numpy.subtract(y, numpy.pi)
return y
或者,更简洁但可读性更差:
def Phi_mpi_pi(x):
return numpy.subtract(numpy.mod(numpy.add(x, numpy.pi), 2*numpy.pi), numpy.pi)
它的作用是这样的:
- 将 π 添加到所有角度(因此它们指向相反的方向)。
- 对所有角度取模 2π,因此它们都在 0 到 2π 之间(不包括 2π)。
- 再次从所有角度中减去 π(因此它们再次指向正确的方向)。现在都是-π到+π(不包括+π)
测试:
x = ak.Array([[0.3, 3.1, numpy.pi, -numpy.pi, -4 * numpy.pi,
200 * numpy.pi, 2 * numpy.pi, -400 * numpy.pi],
[], [-1.4], [-1.8, -6, -1.6], [-4.6]])
y = Phi_mpi_pi(x)
print("Type of result:", type(y))
print("Result =", y)
# Check that the resulting range of each value is correct.
range_is_correct = (ak.all(y >= -numpy.pi) and ak.all(y < numpy.pi))
# Calculate the factors of the 2π adjustments.
factors = (x - y) / (2 * numpy.pi)
print("2π factors=", factors)
# Test that all factors of the 2π adjustmenst are approximate integers.
adjustments_are_correct = ak.all(numpy.abs(numpy.mod(factors, 1)) < 1e-15)
# Test that all values are correct, given the test input.
print("Result is correct:", range_is_correct and adjustments_are_correct)
给出此输出:
Type of result: <class 'awkward1.highlevel.Array'>
Result = [[0.3, 3.1, -3.14, -3.14, 0, 1.78e-14, 0, 4.62e-14, ... [-1.8, 0.283, -1.6], [1.68]]
2π factors= [[2.65e-17, 7.07e-17, 1, 0, -2, 100, 1, -200], [], [0], [0, -1, 0], [-1]]
Result is correct: True
用专门的测试数据证明操作正确
那是你想要的吗?
我有一个函数,我想转换它以便我可以使用笨拙的数组 1。
后面的函数用于 float 但由于已知原因不适用于笨拙的数组。
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,有没有可以使用的直截了当的东西或建议?
我不太明白你想要什么,但这至少可以帮助你调试:
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))
评论太长了,所以我 post 它作为一个答案,当然它并不直接代表解决方案。
好的,知道了。您想将 x 中的每个标量值(都是角度)调整到 -π 和 π 之间。
你可以这样做:
def Phi_mpi_pi(x):
y = numpy.add(x, numpy.pi)
y = numpy.mod(y, 2*numpy.pi)
y = numpy.subtract(y, numpy.pi)
return y
或者,更简洁但可读性更差:
def Phi_mpi_pi(x):
return numpy.subtract(numpy.mod(numpy.add(x, numpy.pi), 2*numpy.pi), numpy.pi)
它的作用是这样的:
- 将 π 添加到所有角度(因此它们指向相反的方向)。
- 对所有角度取模 2π,因此它们都在 0 到 2π 之间(不包括 2π)。
- 再次从所有角度中减去 π(因此它们再次指向正确的方向)。现在都是-π到+π(不包括+π)
测试:
x = ak.Array([[0.3, 3.1, numpy.pi, -numpy.pi, -4 * numpy.pi,
200 * numpy.pi, 2 * numpy.pi, -400 * numpy.pi],
[], [-1.4], [-1.8, -6, -1.6], [-4.6]])
y = Phi_mpi_pi(x)
print("Type of result:", type(y))
print("Result =", y)
# Check that the resulting range of each value is correct.
range_is_correct = (ak.all(y >= -numpy.pi) and ak.all(y < numpy.pi))
# Calculate the factors of the 2π adjustments.
factors = (x - y) / (2 * numpy.pi)
print("2π factors=", factors)
# Test that all factors of the 2π adjustmenst are approximate integers.
adjustments_are_correct = ak.all(numpy.abs(numpy.mod(factors, 1)) < 1e-15)
# Test that all values are correct, given the test input.
print("Result is correct:", range_is_correct and adjustments_are_correct)
给出此输出:
Type of result: <class 'awkward1.highlevel.Array'>
Result = [[0.3, 3.1, -3.14, -3.14, 0, 1.78e-14, 0, 4.62e-14, ... [-1.8, 0.283, -1.6], [1.68]]
2π factors= [[2.65e-17, 7.07e-17, 1, 0, -2, 100, 1, -200], [], [0], [0, -1, 0], [-1]]
Result is correct: True
用专门的测试数据证明操作正确
那是你想要的吗?