一个简单的方法是
broadcasting在扩展其中一个数组然后沿各自的轴进行任意缩减之后-
用In [140]: (full_array==sub_arrays[...,None]).any(axis=1)Out[140]: array([[ True, False, True, False, False, True], [False, True, True, False, True, False]])
searchsorted
特定情况#1
通过
full_array排序以及所有元素
sub_arrays至少存在于中
full_array,我们还可以使用
np.searchsorted-
idx = np.searchsorted(full_array, sub_arrays)out = np.zeros((sub_arrays.shape[0],len(full_array)),dtype=bool)np.put_along_axis(out, idx, 1, axis=1)
具体案例#2
经过
full_array排序后,如果不是所有元素
sub_arrays都保证至少存在于中
full_array,我们需要采取额外的步骤-
idx = np.searchsorted(full_array, sub_arrays)idx[idx==len(full_array)] = 0out = np.zeros((sub_arrays.shape[0],len(full_array)),dtype=bool)np.put_along_axis(out, idx, full_array[idx] == sub_arrays, axis=1)
一般情况
对于
full_array不一定要排序的真正通用情况,我们需要将
sorterarg与
searchsorted-
def isin2D(full_array, sub_arrays): out = np.zeros((sub_arrays.shape[0],len(full_array)),dtype=bool) sidx = full_array.argsort() idx = np.searchsorted(full_array, sub_arrays, sorter=sidx) idx[idx==len(full_array)] = 0 idx0 = sidx[idx] np.put_along_axis(out, idx0, full_array[idx0] == sub_arrays, axis=1) return out
样品运行-
In [214]: full_arrayOut[214]: array(['E', 'F', 'A', 'B', 'D', 'C'], dtype='|S1')In [215]: sub_arraysOut[215]: array([['Z', 'C', 'F'], ['B', 'C', 'E']], dtype='|S1')In [216]: isin2D(full_array, sub_arrays)Out[216]: array([[False, True, False, False, False, True], [ True, False, False, True, False, True]])
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)