如何在不使用“if condition / loop / states”的情况下生成增加的周期序列?

时间:2018-04-01 06:51:54

标签: python numpy math sequence

例如,句点= 4:

x = [1 2 3 4 5 6 7 8 9 10 11 12 13 14]
y = [1 2 3 4 1 2 3 4 1 2  3  4  1  2 ]

为此,我可以简单地做y =((x-1)%4)+ 1

我希望生成一个周期增加的序列。

示例1:初始周期= 2,每经过一段时间(p),就会翻倍。

x = [1 2 3 4 5 6 7 8 9 10 11 12 13 14]
p = [2 2 4 4 4 4 8 8 8  8  8  8  8  8]
y = [1 2 1 2 3 4 1 2 3  4  5  6  7  8]

示例2:初始周期= 3,每经过一段时间(p),就会翻倍。

x = [1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21]
p = [3 3 3 6 6 6 6 6 6 12 12 12 12 12 12 12 12 12 12 12 12]
y = [1 2 3 1 2 3 4 5 6  1  2  3  4  5  6  7  8  9 10 11 12]

无论如何在不使用任何for循环/ if条件/状态的情况下生成y值,仅在给定x时获取y值?

如果给定序列x并且我们知道初始周期,有没有办法计算序列y而不使用任何for循环/ if条件/状态保存?

2 个答案:

答案 0 :(得分:0)

是的,可以找到给定数字x的模数(p)和序列值(y),但它需要使用浮动算术对数。

pow = Floor(Log2(x+1))
p = 1 << pow
y = 1 + (x + 1) % p

初始阶段s(第二个例子中为3)

pow = Floor(Log2((x + s - 1) / s))
p = s * (1 << pow)
y = 1 + (x + s - 1) % p

check:
x=9 pow = 1 p = 6 y = 6
x=10 pow = 2 p = 12 y = 1
x=21 pow = 2 p = 12 y = 12

答案 1 :(得分:0)

对于标量x,我们可以使用bit_length提供纯Python方法:

>>> def periods_py(x):
...    return (x+2)^(1<<(x+2).bit_length()-1)
... 
>>> [periods_py(i) for i in range(1, 15)]
[1, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0]

对于向量x,我找到numpy的最近bit_length替换frexp

>>> def periods_np(x):
...    return (x+2)^(1<<np.frexp(x+2)[1]-1)
... 
>>> periods_np(np.arange(1, 15))
array([1, 0, 1, 2, 3, 0, 1, 2, 3, 4, 5, 6, 7, 0])