测试给定数组的子数组

时间:2013-02-25 13:31:43

标签: python numpy

这是初学者Numpy用户的一个基本问题:我有一个说明5行2列的2D数组,你可以看到10个2d向量,我想测试一个给定的向量是否在表

例如:

>>> tableau = array(range(10), dtype = uint8)
>>> tableau.shape = (5,2)
>>> print tableau
[[ 0  1]
 [ 2  3]
 [ 4  5]
 [ 6  7]
 [ 8  9]]
>>> [0, 1] in tableau
True

最后一行给出了True,但在'tableau'中也是'[0,2]。

目前,我计算欧几里德距离是否为0,但我确信答案更简单。

感谢您的帮助

3 个答案:

答案 0 :(得分:5)

您可以对匹配数组执行布尔缩减:

([0, 1] == tableau).all(axis=1).any()

答案 1 :(得分:1)

直接向前,您可以使用any()通过生成器将数组与array_equal进行比较。

from numpy import array_equal

in_t = lambda x, t : any((array_equal(a,x) for a in t))

print in_t([0, 2], tableau)
print in_t([0, 1], tableau)

答案 2 :(得分:0)

我写了一个函数来解决这个问题,它也处理多维案例。 (@ 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])
使用if语句处理1D,并通过将数组大小调整为2D来处理ND,以便@ ecatmur算法可以工作。我想要解决这个问题的其他方法包括列表推导或循环(实际上可能更有效但只有当列表很长且元素接近开头时);不过,这似乎更加笨拙。

如果你更喜欢在图书馆中使用它,你也可以在这里找到这个功能:

https://github.com/davidmashburn/np_utils(明显的免责声明,我是作者;)