[英]How to find duplicates in a Python list of lists which elements are numpy.ndarray of shape (9, 103)
我得到了一個len(chunks)=195
和len(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_chunk
從chunk
中獲得 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.