У меня есть два массива, которые связаны друг с другом с помощью операции отображения. Я назову их S (f k , f q ) и Z (f i , α j ). Аргументы все частоты дискретизации. Правило отображения довольно простое:
f i = 0,5 · (f k - f q )
α j = f k + f q
S является результатом нескольких БПФ и сложных умножений и определяется в прямоугольной сетке angular. Тем не менее, Z определяется на ромбовидной сетке, и мне не ясно, как лучше всего это хранить. Изображение ниже представляет собой попытку визуализации операции для простого примера массива 4 × 4, но в целом размеры не равны и намного больше (возможно, 64 × 16384, но это выбирается пользователем). Синие точки - это результирующие значения f i и α j , а текст описывает, как они связаны с f k , f q и дискретные индексы. Ромбовидная природа Z означает, что в одном «ряду» будут «столбцы», попадающие между «столбцами» смежных «рядов». Еще один способ думать об этом заключается в том, что f i может принимать значения дробного индекса!
Обратите внимание, что использование нулей или нанов для заполнения элементов, которые не существуют ни в одной данной строке, имеет два недостатка: 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.
Примечание: Это связано с другим вопросом о том, как избавиться от этих неприятных петель. Поскольку речь идет о сохранении результатов, я подумал, что было бы лучше создать два отдельных вопроса.