压缩正弦波标签

2024-05-19 06:23:34 发布

您现在位置:Python中文网/ 问答频道 /正文

{1024{1>位数组中有一个大的^值数组

这意味着存在多个具有相同值的指数范围。在

例如

consider the index range 741 to 795. It maps to 14
consider the index range 721 to 740. It maps to 15
consider the index range 796 to 815. It maps to 15

我想将此映射提供给一个python程序,该程序将输出以下内容:

^{pr2}$

一些到groupby映射值的代码已经准备好了,但是我在使用pairwise编写表达式时遇到了困难。在

以前有人做过类似的事吗?在

我上传了两种形式的数据集:

通常,ordered by index。在

Grouped by mapped value。在


Tags: theto代码程序indexbyrangeit
2条回答

如果您不介意由于舍入而产生的不同值,我可以对您进行压缩。在

from math import pi, sin
interval=2*pi/1024
sinval=lambda i:int(round(sin(i*interval)*36))+50

下面的代码可以实际执行您想做的事情;它与

^{pr2}$

作为测试数据。如果在第一列中有索引,则需要在for循环中切换val和{}的顺序。在

ranges, oldval, oldidx = [[0, 0]], 0, 0
for val, index in vals:
    if not (val == oldval and index == oldidx + 1):
        ranges[-1].append(oldidx)
        ranges.append([val, index])
    oldval, oldidx = val, index
ranges[-1].append(oldidx)
ranges.pop(0)
ifs = ('if((index >= {1}) and (index <= {2})) return {0};\n'.format(val, start, end)
            for val, start, end in ranges)
print ''.join(ifs)

编辑:哎呀,我漏了一行。固定的。另外,你的乘数实际上是36而不是35,我一定是在脑子里把(14,86)四舍五入到(15,85)。在

编辑2:演示如何只存储表的四分之一。在

from math import pi, sin

full = 1024
half = 512
quarter = 256
mag = 72
offset = 50

interval = 2 * pi / full

def sinval(i):
    return int(round(sin(i * interval) * (mag // 2))) + offset

vals = [sinval(i) for i in range(quarter)]

def sintable(i):
    if  i >= half + quarter:
        return 2 * offset - vals[full - i - 1]
    elif  i >= half:
        return 2 * offset - vals[i - half]
    elif i >= quarter:
        return vals[half - i - 1]
    else:
        return vals[i]

for i in range(full):
    assert -1 <= sinval(i) - sintable(i) <= 1

如果从表中减去偏移量,只需将前两个-vals[...]改为。在

另外,底部的比较是模糊的,因为我得到了72比1的错误。这只是因为你的值被四舍五入为整数;它们都是介于两个值中间的地方,所以准确度几乎没有下降。在

结束后,我迟迟没有找到这个解决方案"What's the most Pythonic way to identify consecutive duplicates in a list?"。在


注意:对于周期性fn,比如sine,您可以只存储表的四分之一(即256个值)或一半,然后在查找时对索引执行一点(定点)算法。正如我所说的,如果您进一步不存储+50的偏移量,则需要少一点,代价是在查找时间后增加一个整数。因此,79%的压缩很容易实现。RLE会给你更多。即使fn有噪声,你仍然可以用这种一般的方法得到相当好的压缩。在

正如agf指出的,你的f(n) = 50 + 36*sin(72*pi*n/1024)=50 + g(n),比如说。在

因此,将g(n) = 36*sin(72*pi*n/1024)的256个值制成表格,只针对范围n=0..255

则f(n)可通过以下公式轻松计算:

if 0 <= n < 256, f(n) = 50 + g(n)
if 256 <= n < 512, f(n) = 50 + g(511-n)
if 512 <= n < 768, f(n) = 50 - g(n-512)
if 768 <= n < 1024, f(n) = 50 - g(1023-n)

总之,这里有一个通用的表压缩解决方案,它将生成(istart,iend,value)三元组。在

我对如何使用列表理解和itertools.takewhile();需要抛光。在

^{pr2}$

(注:在agf改变方法之前,我启动了桌上压缩机进近。。。正在尝试获取itertools或列表理解解决方案)

相关问题 更多 >

    热门问题