2010-07-01 294 views
10

如果我有一个numpy数组列表,那么使用remove方法会返回一个值错误。如何从numpy数组列表中删除一个numpy数组?

例如:

import numpy as np 

l = [np.array([1,1,1]),np.array([2,2,2]),np.array([3,3,3])] 

l.remove(np.array([2,2,2])) 

能给我

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

我似乎无法得到所有()的工作,它只是不可能?

+0

就这么你知道,使用'list'作为变量并不是一个好主意,因为它是Python中的关键字。它可能会在稍后回来咬你。 – 2010-07-01 17:40:22

+0

是的,谢谢,我在玩弄时试图解决这个问题,使用list()然后使用remove等将数组转换为列表。 – 2010-07-02 10:24:54

回答

10

这里的问题是,当两个numpy数组与==相比时,就像在remove()和index()方法中一样,返回一个布尔值的数组(按元素比较),它被解释为含糊不清。比较两个numpy数组是否相等的一个好方法是使用numpy的array_equal()函数。因为列表的remove()方法没有关键参数(如sort()),所以我认为你需要使用你自己的函数来做到这一点。这是我做的一个:

def removearray(L,arr): 
    ind = 0 
    size = len(L) 
    while ind != size and not np.array_equal(L[ind],arr): 
     ind += 1 
    if ind != size: 
     L.pop(ind) 
    else: 
     raise ValueError('array not found in list.') 

如果你需要它更快,那么你可以Cython-ize它。

+0

谢谢,非常有用! – 2010-07-02 09:50:24

2

在这里你去:

list.pop(1) 

更新:

list.pop(list.index(element)) 

我不认为你可以绕过遍历列表来查找元素的位置。不要担心。默认情况下,Python会使用一个好的搜索算法来为您找到至少成本。

+0

谢谢,我意识到这适用于我的示例,但实际上我需要这样做,我不知道我想要删除的数组的位置。我认为使用remove方法可能会有更好的方式,而不是使用循环。 – 2010-07-01 12:49:47

+1

感谢您帮助我。如果我使用list.index()作为numpy数组,我会再次得到模糊的真值错误,嗯。 – 2010-07-01 13:11:59