我写了一个函数来解决这个问题,它也处理多维情况。(@ecatmur 的答案在二维中完美运行,但对于 1D 或 3D+ 则失败)
import numpy as np
def haselement(arr,subarr):
'''Test if subarr is equal to one of the elements of arr.
This is the equivalent of the "in" operator when using lists instead of arrays.'''
arr = np.asarray(arr)
subarr = np.asarray(subarr)
if subarr.shape!=arr.shape[1:]:
return False
elif arr.ndim<2:
return (subarr==arr).any()
else:
boolArr = (subarr==arr)
boolArr.resize([arr.shape[0],np.prod(arr.shape[1:])])
return boolArr.all(axis=1).any()
tableau = np.array(range(10), dtype = np.uint8)
tableau.shape = (5,2)
haselement(tableau,[0,1])
1D 使用 if 语句处理,ND 则通过将数组大小调整为 2D 来处理,以便@ecatmur 的算法能够工作。我想到的解决此问题的其他方法涉及列表推导或循环(实际上可能更有效,但前提是列表很长并且元素靠近开头);不过,这似乎更 numpy-thonic。
如果您想从库中使用它,也可以在此处找到该函数:
https://github.com/davidmashburn/np_utils(明显的免责声明,我是作者;))