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

fsp*_*rle 15 python numpy

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

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

def inList(array, list):
    for element in list:
        if np.array_equal(element, array):
            return True
    return False
Run Code Online (Sandbox Code Playgroud)

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

小智 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))
Run Code Online (Sandbox Code Playgroud)

变量 is_in_list 指示 numpy 数组列表中是否存在与要检查的数组相等的数组。


gg3*_*349 7

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
Run Code Online (Sandbox Code Playgroud)

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


Moj*_*Moj 6

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

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 ]
Run Code Online (Sandbox Code Playgroud)

不,您可以检查这样的子列表:

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

In [81]: [1,24,4,5] in a
Out[81]: True
Run Code Online (Sandbox Code Playgroud)

  • 您假设所有数组的形状都相同,这从问题中不清楚。然后将整个列表转换为数组。然后,为了检查,您 ** 将整个内容转换回 ** 为列表列表?幸运的是,这可能适用于 OP 的目的,但它似乎与执行此操作的最佳方式不符。 (2认同)