Jes*_*res 9 python csv arrays numpy fft
我正在读取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
Run Code Online (Sandbox Code Playgroud)
Joe*_*ton 14
据推测,您的csv文件中有一些缺失值.默认情况下,np.genfromtxt将替换缺少的值NaN.
如果数组中有NaNs或Infs,fft则将全部为NaNs或Infs.
例如:
import numpy as np
x = [0.1, 0.2, np.nan, 0.4, 0.5]
print np.fft.fft(x)
Run Code Online (Sandbox Code Playgroud)
我们会得到:
array([ nan +0.j, nan+nanj, nan+nanj, nan+nanj, nan+nanj])
Run Code Online (Sandbox Code Playgroud)
但是,因为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])
Run Code Online (Sandbox Code Playgroud)
我们会得到:
In [18]: xfiltered
Out[18]: array([ 0.1, 0.2, 0.3, 0.4, 0.5])
Run Code Online (Sandbox Code Playgroud)
然后我们可以正常计算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])
Run Code Online (Sandbox Code Playgroud)
...并获得有效的结果.