如何在具有已定义层次结构的相应数组中找到与最近的一组值对应的索引?

How to find the index that corresponds to the nearest group of values in corresponding arrays with a defined hierarchy?

我想在相应的数组中找到多个输入值匹配的索引。例如,考虑一个时间序列,其数据集包含多个数组:yearsmonthsdayshours。数组的值按时间顺序填充。由于数据集是在几年内收集的,因此 years 数组将被排序,但其余数组不会排序(因为 hours 中的值只会从 0-24 中排序每天每月每年)。尽管这个数据集是在几年的时间里收集的,但数据集不一定是连续的——这意味着观察之间的天数或小时数(或由连续索引确定的值)可以大于一(但不总是)。

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]因为years的第2个索引是2018months的第2个索引是1,[=13的第2个索引=]是1hours的第二个索引是17。由于 idx_two 是空的,我想扩大我的搜索范围以找到与下一个最近时间对应的索引。由于每个数组的最后一个索引最接近输入日期时间参数的相应值,因此我希望返回这些数组的最后一个索引(在本例中为 5)。

人们可能倾向于认为不可能在多个数组中找到最近的一组值。但在这种情况下,小时数优先于日期,天数优先于月份等(因为距输入时间 3 小时的观察在时间上比距输入时间 3 天的观察更近)。

我发现了很多适用于一个阵列的绝妙解决方案 via this post on Whosebug,但不适用于适用于多个阵列的条件。此外,最有效的解决方案 posted 假定数组已排序,而在我的示例中唯一排序的数组是年份。

我想我可以重复 post 中建议的操作以在多个数组中的每一个上重复相同的过程 - 这样,我可以找到每个数组共有的索引。然后,可以取输入时间参数与在公共索引处找到的时间参数的差值。从较小单位的数组(在本例中为 hours)开始,可以选择与最小差异对应的索引。但是,我觉得有一种更简单的方法也可能更有效。

如何更好地解决这个问题,通过多个数组找到与最近的数据点分组对应的索引?这是多维数组派上用场的地方吗?

编辑: 再想一想,可以将所有时间参数转换为经过的小时数。然后,可以找到对应于经过小时数最近的观测值的索引。无论如何,我仍然对解决这个问题的各种方法感到好奇。

您的编辑可能是个好主意。

一种快速安全的方法是:

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