问题 你如何从numpy数组列表中删除一个numpy数组?


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

例如:

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:具有多个元素的数组的真值是不明确的。使用a.any()或a.all()

我似乎无法让all()工作,这是不可能的吗?


1804
2017-07-01 11:41


起源

你知道,这不是一个好主意 list 作为变量,因为它是Python中的关键字。它可以在以后回来咬你。 - Justin Peel
是的,谢谢,我在尝试解决这个问题时被咬了,使用list()然后使用remove等将数组转换为列表。 - matt_s


答案:


这里的问题是当两个numpy数组与==进行比较时,如remove()和index()方法,返回一个布尔值的numpy数组(元素比较元素),这被解释为不明确。比较两个numpy数组是否相等的好方法是使用numpy的array_equal()函数。

由于list的remove()方法没有key参数(比如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它。


10
2017-07-01 17:38



谢谢,非常有用! - matt_s


干得好:

list.pop(1)

更新:

list.pop(list.index(element))

我不认为你可以绕过列表来找到元素的位置。别担心。默认情况下,Python会使用一个好的搜索算法来为您找到它。


2
2017-07-01 12:41



谢谢,我意识到这适用于我的例子,但实际上我需要这样做,我不知道我想删除的数组的位置。我认为使用remove方法可能有更好的方法,而不是使用循环。 - matt_s
谢谢你帮我这个。如果我使用list.index()作为numpy数组,我再次得到模糊的真值错误,嗯。 - matt_s