영교차점(zero-crossing) 찾기 (파이썬)
a = [1, 2, 1, 1, -3, -4, 7, 8, 9, 10, -2, 1, -3, 5, 6, 7, -10]
일 때,
In[61]: z =
np.where(np.diff(np.sign(a)))[0]
In[61]: z
Out[62]: array(
[ 3, 5, 9, 10, 11, 12, 15], dtype=int64)
-------------------------------------------------------------------------------------------
a : [ 1, 2, 1, 1, -3, -4, 7, 8, 9,10, -2, 1, -3, 5, 6, 7, -10]
k = np.sign(a) : [ 1, 1, 1, 1, -1, -1, 1, 1, 1, 1, -1, 1, -1, 1, 1, 1, -1]
d = np.diff(k) : [ 0, 0, 0, -2, 0, 2, 0, 0, 0, -2, 2, -2, 2, 0, 0, -2]
np.where(d) : (array([ 3, 5, 9, 10, 11, 12, 15], dtype=int64),)
np.where(d)[0] : [ 3, 5, 9, 10, 11, 12, 15]
-------------------------------------------------------------------------------------------
np.diff()의 결과가
음수이면 데이터가
양수에서 음수로 바뀐 것이고,
np.diff()의 결과가
양수이면 데이터가
음수에서 양수로 바뀐 것이다.
np.where(d)라고 사용하면 d가 영이 아닌 모든 위치를 알려주며, 튜플로 반환된다.
따라서 결과만 얻고자 한다면 np.where(d)[0]로 사용한다.
np.where(d)[0]의 결과는 데이터에서 zero-crossing이 발생하는 시작점을 의미한다.
위의 예에서 "3"은 데이터가 4번째 샘플에서 5번째 샘플로 바뀌는 시점에서 zero-crossing이 발생함을 뜻한다.