在2D和1D数组之间逐元素使用numpy isin

在2D和1D数组之间逐元素使用numpy isin,第1张

在2D和1D数组之间逐元素使用numpy isin 广播基础一

一个简单的方法是

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
不一定要排序的真正通用情况,我们需要将
sorter
arg与
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]])


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5617602.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存