2015-09-26 17 views
5

Tôi đang đọc một cột cụ thể của tệp csv dưới dạng mảng có nhiều mảng. Khi tôi cố gắng làm fft của mảng này, tôi nhận được một mảng NaN. Làm thế nào để có được fft để làm việc? Dưới đây là những gì tôi có cho đến thời điểm này:Làm thế nào để có được FFT của một mảng numpy để làm việc?

#!/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 
+1

bạn đã kiểm tra xem có 'nan' trong vectơ của bạn không? – cel

Trả lời

11

Có lẽ có một số giá trị bị thiếu trong tệp csv của bạn. Theo mặc định, np.genfromtxt sẽ thay thế các giá trị bị thiếu bằng NaN.

Nếu có bất kỳ NaN s hoặc Inf s trong một mảng, fft sẽ là tất cả NaN s hoặc Inf s.

Ví dụ:

import numpy as np 

x = [0.1, 0.2, np.nan, 0.4, 0.5] 
print np.fft.fft(x) 

Và chúng tôi sẽ nhận được:

array([ nan +0.j, nan+nanj, nan+nanj, nan+nanj, nan+nanj]) 

Tuy nhiên, do một FFT hoạt động trên một loạt thường xuyên khoảng cách đều nhau của các giá trị, loại bỏ các giá trị phi hữu hạn từ một mảng phức tạp hơn một chút so với việc chỉ thả chúng.

pandas có một số hoạt động chuyên biệt để thực hiện việc này, nếu bạn đang mở để sử dụng nó (ví dụ: fillna). Tuy nhiên, nó không quá khó để làm với "tinh khiết" numpy.

Trước tiên, tôi sẽ giả định rằng bạn đang làm việc với một chuỗi dữ liệu liên tục vì bạn đang dùng FFT của các giá trị. Trong trường hợp đó, chúng tôi muốn nội suy các giá trị NaN dựa trên các giá trị xung quanh chúng. suy tuyến tính (np.interp) có thể không lý tưởng trong mọi tình huống, nhưng nó không phải là một lựa chọn mặc định xấu:

Ví dụ:

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]) 

Và chúng tôi sẽ nhận được:

In [18]: xfiltered 
Out[18]: array([ 0.1, 0.2, 0.3, 0.4, 0.5]) 

Chúng ta có thể sau đó tính toán FFT bình thường:

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]) 

... và nhận kết quả hợp lệ.

+0

Có, tôi có một chuỗi dữ liệu liên tục. Chuỗi dữ liệu mà tôi đã thu thập được ở 1000 lần mỗi giây trong thời gian 20 giây. Làm thế nào sẽ xử lý các giá trị mất tích hoàn toàn với numpy? –

+1

Bạn có thể sử dụng kết hợp 'np.isfinite' và' np.interp' làm ví dụ thứ hai. (Tôi đã chỉnh sửa nó một vài phút trước, vì vậy bạn có thể cần phải làm mới để xem bản cập nhật.) Hy vọng rằng sẽ giúp! –

Các vấn đề liên quan