查看单个帖子
旧 2019-12-10, 20:48   #1
poster
高级会员
 
注册日期: 2019-11-21
帖子: 3,006
声望力: 66
poster 正向着好的方向发展
帖子 在numpy(Python)中等效于Matlab'ismember'吗?

我正在努力使用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); 请注意,并非所有季度都出现在月份列表中,因此tfloc变量都是必需的。

我在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)(并避免某些常量因素,当然)。



更多&回答...
poster 当前离线   回复时引用此帖