我有一个大的列表看起来像这样(但更大)
lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.]))]
你在我提出的小提取物中看不到它,但有一些元素重复。我需要重复的东西消失。
我尝试过做
newlist = []
for a in lista:
if np.all(a not in newlist):
newlist.append(a)
但它不起作用,它会返回
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
不明白为什么它不起作用。需要将列表中的每个元素作为它们所在的数组列表进行比较。
编辑:副本可以是列表的任何元素。如果一个元素(元组)以与另一个元组相同的顺序共享完全相同的数组,则它是重复的。
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.]))
答案 0 :(得分:1)
您对副本的定义:在列表中重复完全相同的数组的元组。
import numpy as np
# list with the 5th tuple being a duplicate of the 1st
lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])),
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.]))]
clean_list = []
for t in lista:
for ut in clean_list:
if all(np.all(t[i] == ut[i]) for i in range(len(t)))):
# duplicate, discard it
break
else:
# does not exist, keep it
clean_list.append(t)
结果clean_list
将包含除第5个元组之外的所有元组,第5个元组与第1元组重复。
请注意,此示例使用Python的内置all
函数来检查传递给它的所有条件的真实性,并使用numpy.all
来检查比较数组中所有元素的相等性。
答案 1 :(得分:0)
我不太确定你是否正确使用“全部”方法,尽管我不熟悉它。以下是参考:https://docs.scipy.org/doc/numpy/reference/generated/numpy.all.html
你不能这么做吗?:
newlist = []
for a in lista:
if a not in newlist:
newlist.append(a)
答案 2 :(得分:0)
使用in
时,python会迭代列表并检查与元素的相等性。但是,等式检查会产生[True, False, True]
之类的东西,这既不是真的,也不是假的。因此,您无法使用in
运算符,但您可以使用下面的检查对其进行模拟
newlist = []
for line in lista:
for item in line:
if not any(all(item == value) for value in newlist):
newlist.append(item)
基本上,使用all(item==value) for value in list)
来模拟in
和not any
的行为时,您会要求所有检查都不是真的/
答案 3 :(得分:0)
import numpy
from numpy import array
lista = [(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])),
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 0.])),
(array([ 0., 0., 0.]), array([ 0., 1., 0.]), array([ 0., 0., 1.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 0.])),
(array([ 1., 0., 0.]), array([ 0., 0., 0.]), array([ 0., 0., 1.]))]
y = []
for a in lista:
found = 0
for b in y:
if found >= 3:
break
found = 0
for i in range(0,3):
if False in numpy.in1d(a[i], b[i]):
break
found += 1
if found < 3:
y.append(a)
for a in y:
print a
代码遍历列表中的每个元素,并使用numpy.in1d(a, b)
将元素与元组进行比较。如果3个元素因此匹配,则该项目是重复的。否则,它会添加到y
。
答案 4 :(得分:0)
假设所有行的长度相等,以下内容将解决您的问题:
import numpy_indexed as npi
npi.unique(lista)