簡體   English   中英

檢查 numpy 數組是否在 numpy 數組列表中

[英]Check if numpy array is in list of numpy arrays

我有一個 numpy 數組列表和一個 numpy 數組。 我想檢查該單個數組是否是列表的成員。

我想存在一種方法,但我沒有正確搜索......這就是我想出的:

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

這個實現是否正確? 是否有任何現成的功能?

使用動詞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

假設你有一個這樣的數組:

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

有一種更簡單的方法,無需使用 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 數組列表中是否存在與要檢查的數組相等的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM