在未排序的numpy数组中查找值列表的索引

时间:2016-10-13 13:07:38

标签: python arrays numpy

我指的是一个类似的问题:Find indices of a list of values in a numpy array

在这种情况下,我们有一个已排序的主数组和另一个我们想要在主数组中找到索引的数组。

master = np.array([1,2,3,4,5])
search = np.array([4,2,2,3])

建议的解决方案是:

>>> master = np.array([1,2,3,4,5])
>>> search = np.array([4,2,2,3])
>>>np.searchsorted(master, search)
array([3, 1, 1, 2])

但是如果主人没有排序怎么办? 例如,如果我有两个这样的数组,其中第一个没有排序:

>>>master = np.array([2,3,5,4,1])
>>>search = np.array([3,2,1,4,5])

我得到:

>>> np.searchsorted(master, search)
array([1, 0, 0, 2, 5])

但我希望:

array([1,0,4,3,2])

即。在master中搜索的项目索引。

我如何使用numpy的本机函数获取它们?(在搜索中不使用[np.where(master == i)for i)

由于

编辑: 在这种情况下,搜索数组是master的排列。然后我想找到如何置换master的索引来给出像搜索这样的置换数组。

作为一般情况,搜索数组包含主数据中可能包含或不包含的某些项目,例如:

>>>master = np.array([2,3,5,4,1])
>>>search = np.array([1,4,7])

2 个答案:

答案 0 :(得分:1)

如果所有其他方法都失败了,您需要暂时对主数组进行排序,然后在匹配元素后反转所需的排序顺序:

import numpy as np

master = np.array([2,3,5,4,1])
search = np.array([3,2,1,4,5])

# sorting permutation and its reverse
sorti = np.argsort(master)
sorti_inv = np.empty(sorti.shape,dtype=np.int64)
sorti_inv[sorti] = np.arange(sorti.size)

# get indices in sorted version
tmpind = np.searchsorted(master,search,sorter=sorti)

# transform indices back to original array with inverse permutation
final_inds = tmpind[sorti_inv]

以上结果是正确的

array([1, 0, 4, 3, 2])

正如您在评论中指出的那样,您的具体searchmaster是彼此的排列。在这种情况下,您也可以对两个数组进行排序,并使用反向排列和其他直接排列结合使用:

sorti = np.argsort(master)
sorti_inv = np.empty(sorti.shape,dtype=np.int64)
sorti_inv[sorti] = np.arange(sorti.size)
sorti_s = np.argsort(search)
final_inds = sorti_s[sorti_inv]

应该考虑搜索两个数组与搜索另一个数组的排序版本中的一个数组所需的工作量。我真的无法告诉哪一个更快。

答案 1 :(得分:1)

以下是原始问题的答案。 (问题“编辑”没有指定当# --- functions --- def on_ticks(ws, ticks): global df all_name = [] all_ltp = [] for sc in ticks: token = sc['instrument_token'] name = trd_portfolio[token]['name'] all_name.append(name) ltp = sc['last_price'] all_ltp.append(ltp) df = working(df, all_name, all_ltp) def working(df, all_name, all_ltp): for name, ltp in zip(all_name, all_ltp): new_df = pd.DataFrame([name, ltp]).T new_df.columns = ['name', 'ltp'] df = df.append(new_df, ignore_index=True) return df # --- main --- df = pd.DataFrame(data=None) 不是search的子集时应返回的内容)

master

import numpy as np def get_indices(master, search): if not set(search).issubset(set(master)): raise ValueError('search must be a subset of master') sorti = np.argsort(master) # get indices in sorted version tmpind = np.searchsorted(master,search,sorter=sorti) final_inds = sorti[tmpind] return final_inds master = np.array([3, 4, 5, 6, 1, 9, 0, 2, 7, 8]) search = np.array([6, 4, 3, 1, 1]) final_inds = get_indices(master, search) assert( np.array_equal(master[final_inds], search) ) 的结果是

final_inds