Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在数组列表中查找数组存在性的更好方法_Python_Optimization_Numpy_Arraylist_Unique - Fatal编程技术网

Python 在数组列表中查找数组存在性的更好方法

Python 在数组列表中查找数组存在性的更好方法,python,optimization,numpy,arraylist,unique,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.po

我是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]])

如果len(其中(((array(self.pop\u next)-(self.pop[self.top\u indv\u indx[i]])=0.sum(1)==len((self.pop[self.top\u indv\u indx[i]])[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\u与
array\u列表
的所有元素。请注意,这里的
all
\uuuu内置的
,与
numpy.all
相反。如果您以前使用过numpy import*
中的
,这将不起作用。改为使用
import numpy
,并按上述示例中的全名调用函数

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

if array_to_add is not in array_list:
    array_list.append(array_to_add)
编辑:我从您的评论中看到您正在使用numpy数组。我从来没有使用过numpy,所以我不知道它们是如何与集合一起工作的

一种选择是使用
集合
。但它们是无序的,只允许每个项目添加一次:

>>> s = set()
>>> s.add(1)
>>> s.add(2)
>>> s.add(2)
>>> s.add(2)
>>> s
set([1, 2])
但是,如果尝试向集合添加
列表
,则会遇到问题:

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

什么是
在哪里
?您正在使用
numpy
数组吗?另外,如果你能将代码分成几行也很好。我正在使用numpy数组。现在我正在使用where关键字隐式地尝试匹配数组。如果你试图拥有一个不同对象的容器,也许你应该使用
set
和你自己的
\ucmp\uu
操作?你的项目是做什么的?我的项目与一个外部模拟器接口,因此我需要我的数据以数组的形式。我尝试过set,但不知何故它不能直接工作,除非随后进行展平(这给了我一组数字,而不是我需要的向量)谢谢Dave。我知道这很简单,但它也需要我将元组集转换回数组列表表单,因为我需要此表单在并行计算器上运行它。这取决于您有多少个数组以及它们的长度,使用
集合
的性能优势可能超过将数组转换为元组或从元组转换为元组的成本。您可能需要使用
timeit
和/或
time
模块运行一些计时器测试;但是我需要检查数组列表中是否存在数组,我想你的代码只是帮我比较了两个数组。“数组列表中是否存在数组”是指存在完全相同的数组对象,还是指存在恰好具有相同长度和值的数组?第一个很容易检查,请参阅
list.index
方法,或者只查看列表中的
对象
。你是说使用索引检查进行一个“除此之外的尝试”循环,但与我当前的代码相比,这不会降低我的代码的效率吗?
>>> mylist = ['my','list']
>>> s = set()
>>> s.add(tuple(mylist))
>>> s.add(tuple(mylist))
>>> s
set([('my', 'list')])