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ệ.
bạn đã kiểm tra xem có 'nan' trong vectơ của bạn không? – cel