2015-02-02 8 views
7

क्या 1 डी एरे पर एक numpy/scipy/matplotlib फ़ंक्शन के साथ परिपत्र क्रॉस-ऑटो-सहसंबंध प्रदर्शन करना संभव है? मैंने numpy.correlate() और matplotlib.pyplot.xcorr (numpy फ़ंक्शन पर आधारित) को देखा है, और दोनों सर्कुलर क्रॉस-सहसंबंध करने में सक्षम नहीं हैं।सर्कुलर क्रॉस सहसंबंध पाइथन

अंतर को स्पष्ट करने के लिए, मैं [1, 2, 3, 4] की सरणी के उदाहरण का उपयोग करूंगा। परिपत्र सहसंबंध के साथ, एक आवधिक धारणा बनाई जाती है, और 1 का अंतराल [2, 3, 4, 1] जैसा दिखता है। पाइथन फ़ंक्शंस जो मैंने पाया है केवल शून्य-पैडिंग का उपयोग करना प्रतीत होता है, यानी, [2, 3, 4, 0]। क्या इन कार्यों को परिपत्र सहसंबंध करने का कोई तरीका है? यदि नहीं, तो सर्कुलर सहसंबंधों के लिए मानक कार्यवाही है?

उत्तर

8

आप का उपयोग कर समय-समय पर (उर्फ परिपत्र) पार सहसंबंध लागू कर सकते हैं FFT:

from numpy.fft import fft, ifft 

def periodic_corr(x, y): 
    """Periodic correlation, implemented using the FFT. 

    x and y must be real sequences with the same length. 
    """ 
    return ifft(fft(x) * fft(y).conj()).real 

तुम भी, np.correlate का उपयोग कर यदि आप भूमि के ऊपर np.hstack((y[1:], y)) द्वारा किए गए कोई आपत्ति नहीं है इसे लागू कर सकते हैं:

import numpy as np 

def periodic_corr_np(x, y): 
    """Periodic correlation, implemented using np.correlate. 

    x and y must be real sequences with the same length. 
    """ 
    return np.correlate(x, np.hstack((y[1:], y)), mode='valid') 
+0

न केवल fft संस्करण आपको hstack के ऊपरी हिस्से की छापता है, यह एन * लॉग (एन) जटिलता में गणना को बनाता है क्योंकि सहसंबंध के मामले में n^2 के विपरीत। –

+0

[1] और कुछ [अन्य स्रोतों] के अनुसार (http://mathworld.wolfram.com/Cross-Correlation.html) पहला शब्द संयुग्मित होना चाहिए: 'ifft (fft (x) .conj() * fft (वाई)) वास्तविक ' [1] पापौलिस, ए फूरियर इंटीग्रल और इसके अनुप्रयोग। न्यूयॉर्क: मैकग्रा-हिल, पीपी 244-245 और 252-253, 1 9 62। [Google पुस्तकें लिंक] (https://books.google.de/books?id=txMIAQAAIAAJ) –

2
from numpy import roll, correlate 
x = [1,2,3,4] 
roll(x, 1) #[4,1,2,3] 
roll(x, 2) #[3,4,1,2] 
roll(x, 3) #[2,3,4,1] 

सहसंबंधी एक्स के साथ एक्स चक्राकार k से स्थानांतरित कर दिया है, तो आप

कर सकता है
k = 2 
correlate(x, roll(x,k)) 
संबंधित मुद्दे