【问题标题】:Data structure for a diamond-shaped array in pythonpython中菱形数组的数据结构
【发布时间】:2020-04-08 17:50:43
【问题描述】:

我有两个通过映射操作相互关联的数组。我将它们称为 S(fk,fq) 和 Z(fij)。参数都是采样频率。映射规则相当简单:

fi = 0.5 · (fk - fq)
αj = fk + fq

S 是多次 FFT 和复数乘法的结果,定义在矩形网格上。但是,Z 是在菱形网格上定义的,我不清楚如何最好地存储它。下图是对 4×4 数组的简单示例的操作进行可视化的尝试,但通常尺寸不相等并且要大得多(可能是 64×16384,但这是用户可选择的)。蓝点是 fi 和 αj 的结果值,文本描述了它们与 fk、fq 的关系 和离散索引。 Z 的菱形性质意味着在一个“行”中将有“列”位于相邻“行”的“列”之间。另一种思考方式是 fi 可以采用小数索引值!

请注意,使用 0 或 nan 来填充任何给定行中不存在的元素有两个缺点 1)它会扩大可能已经是非常大的二维数组的大小,以及 2)它并不是真的代表 Z 的真实性质(例如,数组大小不会真正正确)。

目前我正在使用索引 αj 的实际值的字典来存储结果:

import numpy as np
from collections import defaultdict
nrows = 64
ncolumns = 16384
fk = np.fft.fftfreq(nrows)
fq = np.fft.fftfreq(ncolumns)
# using random numbers here to simplify the example
# in practice S is the result of several FFTs and complex multiplications
S = np.random.random(size=(nrows,ncolumns)) + 1j*np.random.random(size=(nrows,ncolumns))

ret = defaultdict(lambda: {"fi":[],"Z":[]})
for k in range(-nrows//2,nrows//2):
    for q in range(-ncolumns//2,ncolumns//2):
        fi = 0.5*fk[k] - fq[q]
        alphaj = fk[k] + fq[q]
        Z = S[k,q]
        ret[alphaj]["fi"].append(fi)
        ret[alphaj]["Z"].append(Z)

我仍然觉得这有点麻烦,想知道是否有人对更好的方法有建议?这里的“更好”将被定义为计算和内存效率更高和/或更易于使用 matplotlib 之类的东西进行交互和可视化。

注意:这与 another question 有关如何摆脱那些讨厌的 for 循环有关。由于这是关于存储结果,我认为最好创建两个单独的问题。

【问题讨论】:

    标签: python arrays numpy data-structures


    【解决方案1】:

    您仍然可以将其视为直接的二维数组。但是您可以将其表示为一个行数组,其中每一行都有不同数量的项目。例如,这是您的 4x4 作为 2D 数组:(每个 0 是一个唯一的数据项)

    xxx0xxx
    xx0x0xx
    x0x0x0x
    0x0x0x0
    x0x0x0x
    xx0x0xx
    xxx0xxx
    

    它的稀疏表示是:

    [
      [0],
      [0,0],
      [0,0,0],
      [0,0,0,0],
      [0,0,0],
      [0,0],
      [0]
    ]
    

    通过这种表示,您可以消除空白。从色温转换为行,从光谱频率转换为列(反之亦然)涉及一些数学运算,但这很容易处理。您知道界限,并且项目在每一行中均匀分布。所以翻译应该很容易。

    除非我错过了什么。 . .

    【讨论】:

    • 这会被实现为列表列表吗?我认为这与我现在所做的类似,即让“行”成为字典条目,其中包含表示 fi 和 Z 值的项目。
    • @RyanLynch 我想它类似于你的字典。我认为如果可以的话(我不是 Python 程序员),一组行会更快并且占用更少的内存。我会建议一个结构或对象,而不是为fiz 设置平行行。至于用 matplotlib 或类似的东西查看,我只是不知道。
    【解决方案2】:

    原来answer to a related question on optimization 有效地解决了我如何更好地存储数据的问题。新代码返回 fi, %alpha;j 的二维数组,这些可用于直接索引 S。因此要获取 S 的所有值 % alpha;j = 0,比如一个可以做

    S[alphaj == 0]
    

    我可以非常有效地使用它,这似乎是创建合理数据结构的最快方法。

    【讨论】:

      猜你喜欢
      • 2020-12-08
      • 1970-01-01
      • 2013-06-19
      • 1970-01-01
      • 1970-01-01
      • 2013-11-02
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      相关资源
      最近更新 更多