python - 在 2D 和 1D 数组之间使用 numpy isin element-wise
问题描述
我有一个非常简单的场景,我想测试二维数组的两个元素是否(单独)是更大数组的成员 - 例如:
full_array = np.array(['A','B','C','D','E','F'])
sub_arrays = np.array([['A','C','F'],
['B','C','E']])
np.isin(full_array, sub_arrays)
这给了我一个单维输出:
array([ True, True, True, False, True, True])
显示 full_array 的元素是否存在于两个子数组中的任何一个中。我想要一个二维数组,为 sub_arrays 中的两个元素中的每一个显示相同的东西 - 所以:
array([[ True, False, True, False, False, True],
[ False, True, True, False, True, False]])
希望这是有道理的,并且感激地接受任何帮助。
解决方案
基于广播的
一个简单的方法是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)] = 0
out = 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_array
Out[214]: array(['E', 'F', 'A', 'B', 'D', 'C'], dtype='|S1')
In [215]: sub_arrays
Out[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]])
推荐阅读
- mongodb - 为什么在 Mongodb (PyMongo) 中数据加载为 Nan
- python - 如何在 Django 中通过 modelformset_factory 验证?
- r - 带放回抽样的数据操作
- azure-data-factory - ADF:将输出转换为 JSON 格式
- javascript - PHP Datatable SearchPaneOptions Order By 不起作用
- javascript - d3.js 分层树中的直角链接样式
- sql - 大查询 | 根据运行总和为行分配数字
- latex - 在“groff eqn”中使用多个标记和排列对齐方程
- docker - Swagger 尝试在 HTTPS 上加载资源并失败
- javascript - Firebase 和反应单用户登录