python - 如何让 numpy 数组的 FFT 工作?

标签 python arrays csv 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

最佳答案

您的 csv 文件中可能缺少一些值。默认情况下,np.genfromtxt 会将缺失值替换为 NaN

如果数组中有任何 NaNInf,则 fft 将全部为 NaN s 或 Infs。

例如:

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/

相关文章:

Python 使用数组拆分

php - 为 SilverStripe 创建自定义 CSV 导入器

python - 我可以简化我的代码,这样我就不会单独写出字母表中的每个字母吗?

python - 如何在 Python 中创建 shell 扩展上下文菜单(如 dropbox)

常量中的 PHP 数组键

java - Tic Tac Toe 游戏不会循环+或正确执行规则

c - “int a[5]” 和 int (*a)[5]、int a[5][4] 和 int (*a)[5] 有什么区别? (仅限 C)

pandas - 有没有办法像 Pyspark 那样将 Pandas 数据保存在多个(parquet/csv)文件中?

pandas - 使用 Pandas 读取 CSV 时如何删除 .0

python - 在 forloop 上向 datetime.time() django 添加 +1 小时