测试给定数组的子数组

5 投票
3 回答
2752 浏览
提问于 2025-04-17 17:02

这是一个来自初学者的简单问题,关于Numpy的使用:我有一个二维数组,比如说有5行2列,你可以把它看作10个二维向量,我想测试一个给定的向量是否在这个表格里。

举个例子:

>>> 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,但' [0, 2] in tableau' 也返回True。

目前,我是通过计算欧几里得距离是否为0来判断的,但我相信还有更简单的方法。

谢谢大家的帮助!

3 个回答

0

我写了一个函数来解决这个问题,它还可以处理多维的情况。(@ecatmur 的答案在二维情况下效果很好,但在一维或三维以上时就不行了)

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 语句来处理的,而多维的情况则是通过将数组调整为二维来让 @ecatmur 的算法可以使用。我还想到了其他几种解决方法,比如列表推导式或者循环(这些方法在列表很长且元素靠前时可能更高效);不过,这种方法看起来更符合 numpy 的风格。

如果你想从库中使用这个函数,也可以在这里找到:

https://github.com/davidmashburn/np_utils(当然,我是这个库的作者 ;))

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)
5

你可以对匹配数组进行布尔简化:

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

撰写回答