【发布时间】:2020-04-08 17:50:43
【问题描述】:
我有两个通过映射操作相互关联的数组。我将它们称为 S(fk,fq) 和 Z(fi,αj)。参数都是采样频率。映射规则相当简单:
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