这是初学者Numpy用户的一个基本问题:我有一个说明5行2列的2D数组,你可以看到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,但我确信答案更简单。
感谢您的帮助
答案 0 :(得分:5)
您可以对匹配数组执行布尔缩减:
([0, 1] == tableau).all(axis=1).any()
答案 1 :(得分: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)
答案 2 :(得分: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])
使用if语句处理1D,并通过将数组大小调整为2D来处理ND,以便@ ecatmur算法可以工作。我想要解决这个问题的其他方法包括列表推导或循环(实际上可能更有效但只有当列表很长且元素接近开头时);不过,这似乎更加笨拙。
如果你更喜欢在图书馆中使用它,你也可以在这里找到这个功能:
https://github.com/davidmashburn/np_utils(明显的免责声明,我是作者;)