测试给定数组的子数组

2024-06-08 19:26:30 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个初学者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,但tableau中的'[0,2]也是。在

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

谢谢你的帮助


Tags: 用户innumpytrue距离range数组array
3条回答

直截了当地说,您可以使用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)

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

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

我编写了一个函数来解决这个问题,它也处理多维情况。(@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的算法就可以工作了。我想解决这个问题的其他方法包括列表理解或循环(这实际上可能更有效,但只有当列表很长且元素接近开始的时候);不过,这似乎更像是一种新的方法。在

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

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

相关问题 更多 >