gpt4 book ai didi

python - NumPy - 将值环绕任意边界

转载 作者:行者123 更新时间:2023-12-01 09:13:18 27 4
gpt4 key购买 nike

我有一个数组x,其值包含在[a, b](包括ab > 独家)。现在我想计算 x + y (对于随机 y),使得 x + y 仍然包含在 [a, b ] 通过将结果值包裹在左边界或右边界(以越过的为准)周围。

一个例子抵得上一千个字:

>>> a, b = -5, 5
>>> x = np.array([-4, -2, 0, 2, 4])
>>> wrap(x, 3) # Compute x + 3.
[-1, 1, 3, -5, -3]
>>> wrap(x, -3) # Compute x - 3.
[3, -5, -3, -1, 1]

我提出了以下实现,但并不完全令人满意。

def wrap(x, y):
if y > 0:
return (x - a + y) % (b - a) + a
elif y < 0:
return (x - b + y) % (a - b) + b
else:
return x
  1. 此函数无法正确获取包含/排除边界条件;对于 wrap(x, -3) 它返回 array([ 3, 5, -3, -1, 1])5 应该为-5。我不确定如何包含此功能。
  2. 此外,显式的 if 子句看起来有些人为,我想知道是否可以以更通用的方式处理它(小问题)。

有人知道如何解决这个问题吗?

最佳答案

通过“包装”,我认为结果应该与x+y一致。模组b-a 。 (请注意,本例中 b-a 是“窗口大小”)

考虑特殊情况a==0 。我们有:

def wrap(x, y):
return (x + y) % b

很简单吧?请注意%在Python中是取模——结果的符号总是与除数的符号相同。所以结果将位于 [0..b[ .

在更一般的情况下:

def wrap(x, y):
return (x + y - a) % (b-a) + a

很容易证明返回值与x+y一致。模组b-a .

另请注意,这是 OP 代码中的第一个案例。它对 y 的所有值都有效。 .

<小时/>

但是,如果x是一个 numpy 数组,这将执行 len(x) %操作,这可能会很慢。因此,可以执行以下操作:

def wrap2(x, y):
y %= b - a
x = x + y
return x - (b-a)*(x >= b)

应该会更快。 Try it online!

说明:

  • y %= b-a :减少y范围 [0..b-a[ 。这不会影响结果。
  • x = x + y :添加yx 。此步骤之后x将包含正确的值,模 b-ax 中的所有值应在 [a..b+(b-a)[ 范围内.
  • x - (b-a)*(x >= b) :(x >= b) (如果解释为整数)计算结果为 1如果x >= b ,和0否则。相乘相减b-a来自x将减去b-a从所有值 >= b ,并保留那些 < b完好无损。

关于python - NumPy - 将值环绕任意边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51466576/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com