5

这是初学者 Numpy 用户提出的一个基本问题:我有一个 2D 数组,比如 5 行和 2 列,您可以将其视为 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,但也给出了 '[0, 2] in tableau'。

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

谢谢你的帮助

4

3 回答 3

5

您可以对匹配数组执行布尔归约:

([0, 1] == tableau).all(axis=1).any()
于 2013-02-25T13:40:06.920 回答
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)
于 2014-07-13T07:22:32.447 回答
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])

1D 使用 if 语句处理,ND 则通过将数组大小调整为 2D 来处理,以便@ecatmur 的算法能够工作。我想到的解决此问题的其他方法涉及列表推导或循环(实际上可能更有效,但前提是列表很长并且元素靠近开头);不过,这似乎更 numpy-thonic。

如果您想从库中使用它,也可以在此处找到该函数:

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

于 2014-06-18T21:52:52.380 回答