![]() |
在numpy(Python)中等效于Matlab'ismember'吗?
我正在努力使用[URL="http://www.mathworks.com/help/techdoc/ref/ismember.html"]ismember[/URL]为特定的Matlab编码“模式”找到一个Numpy等效[URL="http://www.mathworks.com/help/techdoc/ref/ismember.html"]项[/URL] 。
不幸的是,这段代码往往会花费大部分时间在我的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); 请注意,并非所有季度都出现在月份列表中,因此[I]tf[/I]和[I]loc[/I]变量都是必需的。 我在StackOverflow上看到了类似的问题,但是它们只是给出一个纯Python解决方案( [URL="https://stackoverflow.com/questions/3824778/equivalent-of-ismember-from-matlab-in-python"]在此处[/URL] ),或者在使用numpy的地方,则不会返回[I]loc[/I]参数( [URL="https://stackoverflow.com/questions/1273041/how-can-i-implement-matlabs-ismember-command-in-python"]在这里[/URL] )。 在我的特定应用领域中,这种特定的代码模式往往会一遍又一遍地出现,并且会占用我函数的大部分CPU时间,因此,这里的有效解决方案对我来说确实至关重要。 也欢迎提出评论或重新设计建议。 [B]回答:[/B] 如果对月份进行了排序,请使用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)(并避免某些常量因素,当然)。 [url=https://stackoverflow.com/questions/4287078]更多&回答...[/url] |
所有时间均为北京时间。现在的时间是 01:08。 |
Powered by vBulletin
版权所有 ©2000 - 2025,Jelsoft Enterprises Ltd.