【问题标题】:Python: numpy fftn over a list of numpy arrayPython:numpy fftn 在 numpy 数组列表上
【发布时间】:2016-12-07 08:41:32
【问题描述】:

我正在尝试有效地 np.fft.fftn 和 2D numpy 数组的数组。 V0 是一个形状为(nvar,nx,ny) 的数组,我想从V0 的第一个维度对每个二维数组执行 FFT。我在这里尝试做的是比较V0 的第一个轴上的迭代,并将其与对整个多维数组进行 FFT 的天真尝试进行比较:

In [45]: import numpy as np

In [46]: V0 = np.random.random((3,128,128))

In [47]: V0fft = []

In [48]: for i in xrange(V0.shape[0]):
    ...:     V0fft.append(np.fft.fftn(V0[i]))
    ...:     

In [49]: V0fftdirect = np.fft.fftn(V0)

In [50]: np.amax(np.abs(V0fft - V0fftdirect))
Out[50]: 16366.207818488827

那我该怎么做才能正确呢?

【问题讨论】:

  • 尝试指定轴numpy.fft.fftn(a, s=None, axes=0, norm=None)
  • 尝试这个V0fftdirect = np.fft.fftn(V0, s=None, axes=0, norm=None) 会导致错误:TypeError: 'numpy.int64' object is not iterable
  • 对不起,axes 应该是一个序列:numpy.fft.fftn(a, s=None, axes=(0), norm=None)
  • 它可以工作,但由于某种原因,它仍然没有给我与迭代第一个轴索引相同的结果 - In [75]: np.amax(np.abs(V0fft - V0fftdirect)) Out[75]: 8226.2612029266456
  • 在for循环中,将np.fft.fftn替换为np.fft.fft2

标签: python arrays python-2.7 numpy fft


【解决方案1】:

V0fftdirect = np.fft.fft2(V0) 完成了这项工作:

In [93]: import numpy as np

In [94]: V0 = np.random.random((3,128,128))

In [95]: V0fftfor = []

In [96]: for i in xrange(V0.shape[0]):
    ...:     V0fftfor.append(np.fft.fftn(V0[i]))
    ...:     

In [97]: V0fftdirect = np.fft.fft2(V0)

In [98]: np.amax(np.abs(V0fftfor - V0fftdirect))
Out[98]: 0.0

【讨论】:

    【解决方案2】:
    • 在 for 循环中将 np.fft.fftn 替换为 np.fft.fft2
    • 指定fftn 轴:numpy.fft.fftn(a, s=None, axes=(-2, -1), norm=None)

    【讨论】:

    • 我觉得应该是np.fft.fftn(V0,axes=(-2,-1))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-11
    • 1970-01-01
    • 2019-07-03
    • 2017-12-23
    • 2016-08-04
    • 1970-01-01
    • 2022-01-25
    相关资源
    最近更新 更多