测试给定数组的子数组
这是一个来自初学者的简单问题,关于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()