2013-02-25 56 views
4

这是初学者Numpy用户的一个基本问题:我有一个说5行2列的二维数组,你可以看到10个2d向量,并且我想测试if一个给定的矢量在桌子里面。测试给定数组的子阵列

例如:

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

最后一行给出真实的,但 '[0,2]在画面' 太。

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

感谢所有帮助

+0

似乎是[此问题]的副本(http://stackoverflow.com/questions/7100242/python-numpy-first-occurrence-of-subarray)。 – Junuxx 2013-02-25 13:37:10

+0

@Junuxx这是一个不同的问题,这里的矢量必须(显然)匹配整行。 – 2013-02-25 13:47:21

+0

@Janne:你是怎么想的?这个例子可能有一个向量,只要矩阵很宽,但问题清楚地说“我想测试一个给定的向量是否在表内”,这是更一般的。 – Junuxx 2013-02-25 13:48:56

回答

6

可以进行匹配阵列上的布尔减少:

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

谢谢,它比我想象的更复杂:) – Fred 2013-02-25 13:44:49

+0

@Junuxx它为我做;你在测试什么? – ecatmur 2013-02-25 13:50:41

+0

@ecatmur:'[0,1]'。 – Junuxx 2013-02-25 13:52:51

0

我写来解决这个,也负责处理多维情况下的功能。 (@ ecatmur的回答完全在两个维度,但没有一维或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语句通过调整阵列2D使@ ecatmur处理,ND的处理算法会工作。我认为解决这个问题的其他方法涉及列表理解或循环(实际上它可能更高效,但只有当列表很长且元素接近开始时)。尽管如此,这看起来更加朴实无华。

你也可以在这里找到的功能,如果你宁愿从库中使用它:

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

+0

顺便说一句,haselement(arr,subarr)或elementof(subarr,arr)对人更有意义吗?谢谢。 – David 2014-06-18 22:02:48

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)