在三维阵列的每个轴上应用DFT矩阵?

2024-03-28 15:22:29 发布

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

我可以首先得到给定大小的DFT矩阵,比如n

import numpy as np
n = 64
D = np.fft.fft(np.eye(n))

当然,FFT只是一种将D应用于向量的快速算法:

^{pr2}$

2D FFT可通过对矩阵的行和列应用D来获得:

x = np.random.randn(n,n)
ft2 = np.dot(x, D.T) # Apply D to rows.
ft2 = np.dot(D, ft2) # Apply D to cols.
print( np.abs(ft2 - fft.fft2(x)).max() )
# near machine round off again

如何对三维离散傅里叶变换进行类似计算?

也就是说

x = np.random.randn(n,n,n)
ft3 = # dot operations using D and x
print( np.abs(ft3 - fft.fftn(x)).max() )
# prints near zero

本质上,我认为我需要将D应用于卷中的每个列向量,然后是卷中的每个行向量,最后是每个“深度向量”。但我不知道如何使用dot来实现这一点。在


Tags: tofftnp矩阵randomabs向量dot
1条回答
网友
1楼 · 发布于 2024-03-28 15:22:29

可以使用einsum表达式对每个索引执行转换:

x = np.random.randn(n, n, n)
ft3 = np.einsum('ijk,im->mjk', x, D)
ft3 = np.einsum('ijk,jm->imk', ft3, D)
ft3 = np.einsum('ijk,km->ijm', ft3, D)
print(np.abs(ft3 - np.fft.fftn(x)).max())
1.25571216554e-12

这也可以写成一个单独的NumPy步骤:

^{pr2}$

但是,如果没有优化参数(在NumPy 1.12+中可用),它将非常缓慢。您也可以使用dot来完成每一个步骤,但是它需要一点重塑和转换。在nump1.14+中,einsum函数将自动检测BLAS操作并为您执行此操作。在

相关问题 更多 >