检查numpy数组是否在numpy数组列表中。

38

我有一个numpy数组列表和一个单独的numpy数组。我想检查那个单独的数组是否是该列表的成员。

我想应该存在一种方法,但我没有搜索得很好...这是我想到的:

def inList(array, list):
    for element in list:
        if np.array_equal(element, array):
            return True
    return False

这个实现是否正确?有没有现成的函数可以用?


你能提供一个例子吗? - Moj
2
这个实现是否正确?嗯,你测试过了吗?! - jonrsharpe
2
显然,您正在使用ndarray列表,因为它们可以具有不同的长度或数据类型?否则,您将会将列表转换为数组。那么,单个数组成为列表的成员是什么意思呢?它必须是相同的还是等于您正在测试的数组? - eickenberg
仅供参考,类似的问题在这里得到了回答,https://dev59.com/Wm035IYBdhLWcg3wVebn - wingr
3个回答

15

使用np.all()可以更简单地实现,无需循环。当列表中的所有数组形状相同时,此方法有效:

list_np_arrays = np.array([[1., 1.], [1., 2.]])
array_to_check = np.array([1., 2.])

is_in_list = np.any(np.all(array_to_check == list_np_arrays, axis=1))
变量is_in_list表示numpy数组列表中是否存在任何等于要检查的数组的数组。

如果您想检查容差内的相等性:np.any(np.all(np.isclose(array_to_check, list_np_arrays, axis=1))) - KindaTechy

13

当谈论 Python 时使用动词is有点含糊不清。这个例子涵盖了我能想到的所有情况:

from __future__ import print_function
from numpy import array, array_equal, allclose

myarr0 = array([1, 0])
myarr1 = array([3.4499999, 3.2])
mylistarr = [array([1, 2, 3]), array([1, 0]), array([3.45, 3.2])]

#test for identity:
def is_arr_in_list(myarr, list_arrays):
    return next((True for elem in list_arrays if elem is myarr), False)

print(is_arr_in_list(mylistarr[2], mylistarr)) #->True
print(is_arr_in_list(myarr0, mylistarr)) #->False
#myarr0 is equal to mylistarr[1], but it is not the same object!

#test for exact equality
def arreq_in_list(myarr, list_arrays):
    return next((True for elem in list_arrays if array_equal(elem, myarr)), False)

print(arreq_in_list(myarr0, mylistarr)) # -> True
print(arreq_in_list(myarr1, mylistarr)) # -> False

#test for approximate equality (for floating point types)
def arreqclose_in_list(myarr, list_arrays):
    return next((True for elem in list_arrays if elem.size == myarr.size and allclose(elem, myarr)), False)

print(arreqclose_in_list(myarr1, mylistarr)) #-> True

注意:不要使用 list 作为变量名,因为它是一个保留关键字,通常会导致细微的错误。同样,也不要使用 array


你如何获取arreq_in_list中数组在列表中的索引? - GJZ

7

假设你有一个像这样的数组:

a= [array([ 1, 24,  4, 5]), array([ 22,   4, 123]), array([11,  1,  1])]
#convert all subarrays to list
a= [ list(item) for item in a ]

现在你可以通过以下方式检查子列表:

In [80]: [1,22,4] in a
Out[80]: False

In [81]: [1,24,4,5] in a
Out[81]: True

3
你假设所有的数组形状都相同,但这并没有在问题中明确说明。然后你将整个列表转换为一个数组。然后,为了检查,你又将整个东西转换回来成为一个列表嵌套列表?这可能会因为运气好而对问题提出者有用,但这似乎不是最佳方法。 - eickenberg
1
@eickenberg,你说的最优解是正确的。他说他有一个NumPy数组列表,要使用这个解决方案,所有数组都应该转换为列表。所以我可以遍历嵌套列表并进行转换,或者使用上面的解决方案。关于长度相同的数组,你是对的。我正在更新我的解决方案。 - Moj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接