比较数组列表的元素

时间:2016-12-10 12:46:51

标签: python arrays numpy

我有一个大的列表看起来像这样(但更大)

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.]))

5 个答案:

答案 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)来模拟innot 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)