我正在将 csv 文件的特定列作为 numpy 数组读取。当我尝试对该数组进行 fft 运算时,我得到了一个 NaN 数组。我如何让 fft 工作?这是我到目前为止所拥有的:
#!/usr/bin/env python
from __future__ import division
import numpy as np
from numpy import fft
import matplotlib.pyplot as plt
fileName = '/Users/Name/Documents/file.csv'
#read csv file
df = np.genfromtxt(fileName, dtype = float, delimiter = ',', names = True)
X = df['X'] #get X from file
rate = 1000. #rate of data collection in points per second
Hx = abs(fft.fft(X))
freqX = fft.fftfreq(len(Hx), 1/rate)
plt.plot(freqX,Hx) #plot freqX vs Hx
最佳答案
您的 csv 文件中可能缺少一些值。默认情况下,np.genfromtxt
会将缺失值替换为 NaN
。
如果数组中有任何 NaN
或 Inf
,则 fft
将全部为 NaN
s 或 Inf
s。
例如:
import numpy as np
x = [0.1, 0.2, np.nan, 0.4, 0.5]
print np.fft.fft(x)
我们会得到:
array([ nan +0.j, nan+nanj, nan+nanj, nan+nanj, nan+nanj])
但是,由于 FFT 对规则间隔的一系列值进行运算,因此从数组中删除非有限值比仅删除它们要复杂一些。
pandas
有几个专门的操作来执行此操作,如果您愿意使用它(例如 fillna
)。然而,使用“纯”numpy 并不太难。
首先,我假设您正在处理一系列连续的数据,因为您要对这些值进行 FFT。在这种情况下,我们希望根据它们周围的值对 NaN
值进行插值。线性插值 (np.interp
) 可能并非在所有情况下都是理想的,但它是一个不错的默认选择:
例如:
import numpy as np
x = np.array([0.1, 0.2, np.nan, 0.4, 0.5])
xi = np.arange(len(x))
mask = np.isfinite(x)
xfiltered = np.interp(xi, xi[mask], x[mask])
我们会得到:
In [18]: xfiltered
Out[18]: array([ 0.1, 0.2, 0.3, 0.4, 0.5])
然后我们可以正常计算 FFT:
In [19]: np.fft.fft(xfiltered)
Out[19]:
array([ 1.50+0.j , -0.25+0.34409548j, -0.25+0.08122992j,
-0.25-0.08122992j, -0.25-0.34409548j])
...并获得有效结果。
关于python - 如何让 numpy 数组的 FFT 工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32800623/