簡體   English   中英

如何在 Python 列表列表中查找重復項,哪些元素是 numpy.ndarray 的形狀(9、103)

[英]How to find duplicates in a Python list of lists which elements are numpy.ndarray of shape (9, 103)

我得到了一個len(chunks)=195len(chunks[0]) = 32的列表(我稱之為塊)。 chunks[0]中的元素類型為numpy.ndarray和形狀 (9,103)。

type(chunks[0][0])   
<class 'numpy.ndarray'>   
type(chunks[0][0][0])  
<class 'numpy.ndarray'>  
type(chunks[0][0][0][0])  
<class 'numpy.float64'>

我正在嘗試查找chunks[0]中是否存在重復項。 我想到的最合適的方法是len(chunks[0]) != set(chunks[0])但這會引發錯誤:'TypeError: unhashable type'。

是否有另一種可行的方法來調查chunks[0]內的元素是否相等,如果是,則從列表中消除重復項? 是否建議將它們轉換為張量以快速檢查重復項?

問題

Hashables 數據類型,即那些可以用作集合中的元素或字典中的鍵的數據類型,必須是不可變的。 那是因為您每次嘗試查找它時都必須獲得相同的 hash 值,但如果您可以修改它,hash 值將會改變。 例如,列表和 arrays 可以更改,因此不可散列,但元組是不可變的,因此它們是可散列的。

一種可能的解決方案

您可以創建一個包含列表或數組或 arrays 列表中的值的元組,並在您的集合中使用它。

示例代碼

您可以使用以下功能來解決您的問題:

def 2d_array_to_tuples(a):
    return tuple(tuple(row) for row in a)

def list_of_2d_arrays_to_tuples(a_list):
    return tuple(2d_array_to_typles(a) for a in a_list)

這兩個函數返回“2D”和“3D”元組,它們是可散列的。 您可以將它們的返回值插入到集合中。

然后這可以檢測兩個塊是否以相同的順序包含相同的 32 arrays:

len(chunks) != len(set(list_of_2d_arrays_to_tuples(chunk) for chunk in chunks))

或者,如果您想在chunks[0]中查找重復的 arrays :

len(chunks[0]) != len(set(2d_array_to_tuples(a) for a in chunks[0]))

消除重復項

如果您想消除列表中的重復項,我會稍微展開這些代碼。 chunk = chunks[0]並說您希望uniq_chunkchunk中獲得 arrays 而沒有重復項。 這段代碼應該可以解決問題:

found = set()
uniq_chunk = []
for a in chunk:
    as_tuple = 2d_array_to_tuples(a)
    if as_tuple not in found:
        found.add(as_tuple)
        uniq_chunk.append(a)

您可以將此方法調整為您嘗試刪除重復數據的確切內容。

暫無
暫無

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

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