在数组列表中找到数组存在的更好方法

时间:2011-11-18 13:35:52

标签: python optimization numpy arraylist unique

我是Python的新手,并尝试了不同的方法来优化和简化我的代码。

我有一个最初为空的数组列表(必须采用这种格式),我需要使用数组进行更新,确保不会添加重复的条目。

现在我正在按照以下方式进行,这是我尝试过的唯一有效的方法:

if len(where(((array(self.pop_next)-(self.pop[self.top_indv_indx[i]]))==0).sum(1)==len((self.pop[self.top_indv_indx[i]])))[0])<=0):
     self.pop_next.append(self.pop[self.top_indv_indx[i]])

其中self.pop_next是我的数组列表,self.pop[self.top_indv_indx[i]]是要添加的数组。

我知道这个Unpythonic并且猜测有更好的简单方法来做同样的事情。 请帮忙

2 个答案:

答案 0 :(得分:1)

  

编辑:我从您的评论中看到您正在使用numpy数组。我从来没有使用numpy所以我不知道他们如何使用套装。

一种选择是使用setSets are like lists但它们是无序的,只允许每个项目添加一次:

>>> s = set()
>>> s.add(1)
>>> s.add(2)
>>> s.add(2)
>>> s.add(2)
>>> s
set([1, 2])

但是,如果您尝试将list添加到集合中,则会遇到问题:

>>> s.add(['my','list'])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

要添加到set的项must be hashablelist无法清除,因为它不能具有不变的哈希值,因为它可以随时修改添加或删除值。

如果你不需要你要检查的列表是可变的,你可以将它们转换为固定且易于安装并且设置友好的元组:

>>> mylist = ['my','list']
>>> s = set()
>>> s.add(tuple(mylist))
>>> s.add(tuple(mylist))
>>> s
set([('my', 'list')])

答案 1 :(得分:0)

您可能希望尝试使用numpy.all(array1 == array2)作为单个数组比较的条件。

编辑扩展程序:

要遍历列表,您可以使用以下内容:

if all((numpy.all(array_to_add != a) for a in array_list)):
    array_list.append(array_to_add)

这会将array_to_addarray_list的所有元素进行比较。请注意,all此处为__builtin__.all,与numpy.all形成鲜明对比。如果您之前执行过from numpy import *,则无效。请改用import numpy,并按照上面的示例中的全名调用函数。

如果可以按对象进行比较(例如,如果内存中的两个数组完全相同,则两个数组相同),请使用以下更简单的变体:

if array_to_add is not in array_list:
    array_list.append(array_to_add)