例如,句点= 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条件/状态保存?
答案 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])