2010-07-01 159 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