繁体   English   中英

在NumPy中沿3D阵列的每个轴应用DFT矩阵吗?

[英]Apply DFT matrix along each axis of 3D array in NumPy?

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

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

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

x = np.random.randn(n)
ft1 = np.dot(D,x)
print( np.abs(ft1 - fft.fft(x)).max() )
# prints near double precision roundoff

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

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

如何针对3D离散傅立叶变换进行类似计算?

也就是说,

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做到这一点。

您可以使用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步骤:

ft3 = np.einsum('ijk,im,jn,kl->mnl', ft3, D, D, D, optimize=True)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM