2017-12-03 14 views
1

해당 배열에서 여러 입력 값이 일치하는 인덱스를 찾고 싶습니다. 예를 들어 데이터 집합에 years, months, dayshours과 같이 여러 배열이 포함 된 시계열을 생각해 봅시다. 배열의 값은 시간순으로 채워집니다. 데이터 세트는 몇 년에 걸쳐 수집되기 때문에 years 배열은 정렬되지만 나머지 배열은 그렇지 않습니다 (hours의 값은 일년에 한 번 일년에 0-24에서 정렬되기 때문에). 이 데이터 세트가 수 년 동안 수집 되더라도 데이터 세트는 반드시 연속적 일 필요는 없습니다. 즉, 관측 사이의 일 또는 시간 (또는 연속 지표로 결정되는 값) 일 수 있습니다). years의 두번째 인덱스 2018 때문에정의 된 계층이있는 해당 배열에서 가장 가까운 값 그룹에 해당하는 인덱스를 찾는 방법은 무엇입니까?

import numpy as np 

years = np.array([2017, 2017, 2018, 2018, 2018, 2018]) 
months = np.array([12, 12, 1, 1, 1, 2]) # 1-12 months in the year 
days = np.array([31, 31, 1, 2, 18, 1]) # 28 (or 29), 30, or 31 days per month 
hours = np.array([4, 2, 17, 12, 3, 15]) # 0-23 hours per day 

def get_matching_time_index(yy, mm, dd, hh): 
    """ This function returns an array of indices at which all values are matched in their corresponding arrays. """ 
    res, = np.where((years == yy) & (months == mm) & (days == dd) & (hours == hh)) 
    return res 

idx_one = get_matching_time_index(2018, 1, 1, 17) 
# >> [2] 

idx_two = get_matching_time_index(2018, 2, 2, 0) 
# >> [] 

idx_one = [2], months의 두번째 인덱스 days의 두번째 인덱스 1이다 1이며, hours의 두번째 인덱스 17이다. idx_two이 비어 있었기 때문에 가장 가까운 다음 시간에 해당하는 색인을 찾으려면 검색 범위를 확장하고 싶습니다. 각 배열의 마지막 인덱스는 입력 datetime 매개 변수의 해당 값에 가장 가깝기 때문에이 배열의 마지막 인덱스를 반환해야합니다 (이 경우 5).

여러 배열에서 가장 가까운 값 그룹을 찾을 수 없다고 생각하는 경향이 있습니다. 그러나이 경우 시간은 입력 시간보다 3 시간 늦은 관측보다 입력 시간보다 3 일 늦은 관측보다 더 가깝기 때문에 몇 달보다 우선하는 요일보다 우선합니다.

하나의 배열 via this post on StackOverflow에서 작동 할 멋진 해결책이 많이 있지만 여러 배열에서 작동하는 조건이 아닙니다. 또한, 가장 효율적인 솔루션은 배열이 정렬되어 있다고 가정하지만, 예제의 경우 정렬 된 배열은 수년입니다.

여러 배열 각각에 대해 동일한 절차를 반복하기 위해 해당 게시물에서 제안하는 작업을 반복 할 수 있다고 가정합니다. 이렇게하면 각 배열에 공통적으로 나타나는 인덱스를 찾을 수 있습니다. 그런 다음 공통 색인에서 발견되는 입력 시간 매개 변수와 시간 매개 변수의 차이를 취할 수 있습니다. 더 작은 단위 배열 (이 경우 hours)부터 시작하여 가장 작은 차이에 해당하는 인덱스를 선택할 수 있습니다. 그러나 더 효율적인 접근 방법이 있다는 생각이 듭니다.

여러 배열을 통해 가장 가까운 데이터 요소 그룹에 해당하는 색인을 찾으려면이 문제에 더 잘 접근 할 수 있습니까? 다차원 배열이 편리한 곳입니까?

편집 : 두 번째 생각에서 모든 매개 변수를 경과 시간으로 변환 할 수 있습니다. 그러면 경과 시간이 가장 가까운 관찰에 해당하는 색인을 찾을 수 있습니다. 그럼에도 불구하고 나는이 문제에 접근하는 다양한 방법에 대해 여전히 궁금하다.

답변

1

귀하의 수정 사항은 아마도 좋은 아이디어입니다.

그것을 달성하기 위해 빠른 안전한 방법은 다음과 같습니다

In [93]: dates=np.vectorize(datetime.datetime)(years,months,days,hours) 

In [94]: np.abs(datetime.datetime(2018, 1, 1, 0)-dates).argmin() 
Out[94]: 2