[PYTHON] numpy에서 다차원 배열의 자기 상관
PYTHONnumpy에서 다차원 배열의 자기 상관
나는 2 차원 배열, 즉 배열 인 배열 배열을 가지고 있습니다. 각 시퀀스에 대해 자기 상관을 계산하고 싶습니다. 따라서 (5,4) 배열의 경우 5 개의 결과 또는 차원 (5,7)의 배열을 얻습니다.
나는 첫 번째 차원을 반복 할 수 있다는 것을 알고 있지만 그것은 느리고 내 최후의 수단이다. 다른 방법이 있습니까?
감사!
편집하다:
선택한 답변과 mtrw의 의견을 바탕으로 다음과 같은 기능이 있습니다.
def xcorr(x):
"""FFT based autocorrelation function, which is faster than numpy.correlate"""
# x is supposed to be an array of sequences, of shape (totalelements, length)
fftx = fft(x, n=(length*2-1), axis=1)
ret = ifft(fftx * np.conjugate(fftx), axis=1)
ret = fftshift(ret, axes=1)
return ret
length는 코드에서 전역 변수이므로 반드시 선언해야합니다. 또한 복소수를 고려해야하기 때문에 결과를 실수로 제한하지 않았습니다.
해결법
-
==============================
1.FFT 기반 자기 상관 사용 :
FFT 기반 자기 상관 사용 :
import numpy from numpy.fft import fft, ifft data = numpy.arange(5*4).reshape(5, 4) print data ##[[ 0 1 2 3] ## [ 4 5 6 7] ## [ 8 9 10 11] ## [12 13 14 15] ## [16 17 18 19]] dataFT = fft(data, axis=1) dataAC = ifft(dataFT * numpy.conjugate(dataFT), axis=1).real print dataAC ##[[ 14. 8. 6. 8.] ## [ 126. 120. 118. 120.] ## [ 366. 360. 358. 360.] ## [ 734. 728. 726. 728.] ## [ 1230. 1224. 1222. 1224.]]
나는 치수 (5, 7)를 갖는 답에 관한 당신의 진술에 약간 혼란스러워서, 아마도 내가 이해하지 못하는 중요한 것이있을 것입니다.
편집 : mtrw의 제안에, 주위에 포장하지 패딩 버전 :
import numpy from numpy.fft import fft, ifft data = numpy.arange(5*4).reshape(5, 4) padding = numpy.zeros((5, 3)) dataPadded = numpy.concatenate((data, padding), axis=1) print dataPadded ##[[ 0. 1. 2. 3. 0. 0. 0. 0.] ## [ 4. 5. 6. 7. 0. 0. 0. 0.] ## [ 8. 9. 10. 11. 0. 0. 0. 0.] ## [ 12. 13. 14. 15. 0. 0. 0. 0.] ## [ 16. 17. 18. 19. 0. 0. 0. 0.]] dataFT = fft(dataPadded, axis=1) dataAC = ifft(dataFT * numpy.conjugate(dataFT), axis=1).real print numpy.round(dataAC, 10)[:, :4] ##[[ 14. 8. 3. 0. 0. 3. 8.] ## [ 126. 92. 59. 28. 28. 59. 92.] ## [ 366. 272. 179. 88. 88. 179. 272.] ## [ 734. 548. 363. 180. 180. 363. 548.] ## [ 1230. 920. 611. 304. 304. 611. 920.]]
이것을하기위한보다 효율적인 방법이 있어야합니다. 특히 자기 상관은 대칭 적이기 때문에 그것을 활용하지 않습니다.
-
==============================
2.정말 큰 배열의 경우 n = 2 ** p를 갖는 것이 중요해진다. 여기서 p는 정수이다. 이렇게하면 엄청난 시간을 절약 할 수 있습니다. 예 :
정말 큰 배열의 경우 n = 2 ** p를 갖는 것이 중요해진다. 여기서 p는 정수이다. 이렇게하면 엄청난 시간을 절약 할 수 있습니다. 예 :
def xcorr(x): l = 2 ** int(np.log2(length * 2 - 1)) fftx = fft(x, n = l, axis = 1) ret = ifft(fftx * np.conjugate(fftx), axis = 1) ret = fftshift(ret, axes=1) return ret
이렇게하면 랩 어라운드 오류가 발생할 수 있습니다. 큰 배열의 경우 자동 상관 관계가 가장자리 근처에서 중요하지 않습니다.
-
==============================
3.어쩌면 단지 선호도 일 수도 있지만 정의를 따랐 으면합니다. 나는 개인적으로 그 방법을 따르기가 조금 더 쉽다는 것을 발견했다. 이 임의의 nd 배열에 대한 내 구현입니다.
어쩌면 단지 선호도 일 수도 있지만 정의를 따랐 으면합니다. 나는 개인적으로 그 방법을 따르기가 조금 더 쉽다는 것을 발견했다. 이 임의의 nd 배열에 대한 내 구현입니다.
itertools에서 제품 가져 오기 numpy 가져 오기 빈, 롤에서
from https://stackoverflow.com/questions/4503325/autocorrelation-of-a-multidimensional-array-in-numpy by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] AWS 탄두에 구조화 된 Flask 앱을 배치하는 방법 (0) | 2018.10.28 |
---|---|
[PYTHON] wxPython WebView 예제 (0) | 2018.10.28 |
[PYTHON] 헤더가 반복되지 않고 여러 개의 CSV 파일 병합 (Python 사용) [닫힘] (0) | 2018.10.28 |
[PYTHON] 여러 웹 사이트에 하나의 Scrapy 스파이더 사용 (0) | 2018.10.28 |
[PYTHON] Spyder의 간단한 Python 다중 처리 기능이 결과를 출력하지 않습니다. (0) | 2018.10.28 |