Labfans是一个针对大学生、工程师和科研工作者的技术社区。 | 论坛首页 | 联系我们(Contact Us) |
![]() |
![]() |
#1 |
高级会员
注册日期: 2019-11-21
帖子: 3,006
声望力: 66 ![]() |
![]()
我正在努力使用ismember为特定的Matlab编码“模式”找到一个Numpy等效项 。
不幸的是,这段代码往往会花费大部分时间在我的Matlab脚本中,所以我想找到一个高效的Numpy等效项。 基本模式包括将子集映射到更大的网格。我有一组存储为并行数组的键值对,我想将这些值插入以相同方式存储的较大的键值对列表中。 具体来说,我有季度GDP数据,可将其映射到每月时间网格,如下所示。 quarters = [200712 200803 200806 200809 200812 200903]; gdp_q = [10.1 10.5 11.1 11.8 10.9 10.3]; months = 200801 : 200812; gdp_m = NaN(size(months)); [tf, loc] = ismember(quarters, months); gdp_m(loc(tf)) = gdp_q(tf); 请注意,并非所有季度都出现在月份列表中,因此tf和loc变量都是必需的。 我在StackOverflow上看到了类似的问题,但是它们只是给出一个纯Python解决方案( 在此处 ),或者在使用numpy的地方,则不会返回loc参数( 在这里 )。 在我的特定应用领域中,这种特定的代码模式往往会一遍又一遍地出现,并且会占用我函数的大部分CPU时间,因此,这里的有效解决方案对我来说确实至关重要。 也欢迎提出评论或重新设计建议。 回答: 如果对月份进行了排序,请使用np.searchsorted 。否则,进行排序,然后使用np.searchsorted : import numpy as np quarters = np.array([200712, 200803, 200806, 200809, 200812, 200903]) months = np.arange(200801, 200813) loc = np.searchsorted(months, quarters) np.searchsorted返回插入位置。如果您的数据有可能不在正确的范围内,那么您之后可能需要进行检查: valid = (quarters = months.min()) loc = loc[valid] 这是一个O(N log N)解决方案。如果就运行时间而言,这仍然是程序中的大问题,则可以使用散列方案在C(++)中执行此一个子例程,该方案应为O(N)(并避免某些常量因素,当然)。 更多&回答... |
![]() |
![]() |