问题 检查numpy数组是否在numpy数组列表中


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

我想有一种方法,我没有正确搜索...这就是我想出的:

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

这个实现是否正确?这有什么功能吗?


11525
2018-06-01 10:58


起源

你能提供一个例子吗? - Moj
“这个实现是否正确?” 好吧,有你 测试了它?! - jonrsharpe
显然你正在使用 名单 的 ndarray是因为它们可以有不同的长度或数据类型?否则,您将列表转换为数组。你是什​​么意思,单个阵列是列表的成员?它必须是 相同 或者它必须是 等于 你正在测试的阵列? - eickenberg
仅供参考,这里回答了类似的问题, stackoverflow.com/questions/5488307/numpy-array-in-python-list - wingr


答案:


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

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

PS:不要使用 list 对于变量名称,因为它是保留关键字,并且经常导致细微的错误。同样,不要使用 array


6
2018-06-01 11:49





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

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
2018-06-01 11:16



您假设所有数组都具有相同的形状,从问题中不清楚。然后将整个列表转换为数组。然后,为了检查,你 将整个事物转换回来 列表清单?这可以通过运气来为OP目的而工作,但似乎并没有接近最佳方式。 - eickenberg
@eickenberg你是对的最佳解决方案。这基本上他说他有一个numpy数组的列表,并且为了使用这个解决方案,所有数组都应该转换为list。所以我可以迭代嵌套列表并转换或使用上面的解决方案。关于你正确的长度数组。我正在更新我的解决方案 - Moj