从Python数组列表中删除数组

3
我想以这种方式从数组列表中删除数组
i = np.array([1,2])
facets = [np.array([1,2]),np.array([3,4])]

我想要移除一个元素。
facets.remove(np.array(i[0],i[1]))

但是出现了错误:

ValueError                                Traceback (most recent call last)
<ipython-input-131-c0d040653e23> in <module>()
----> 1 facets.remove([i[0],i[2]])

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

有没有解决这个问题的方法?


facets的声明引发了一个错误。 - undefined
是的=)一个错误=)我想简化代码示例。 - undefined
你的代码仍然无法解析。最后一行需要是 facets.remove(np.array([i[0],i[1]])) - undefined
我已经编辑过了,抱歉。这对问题来说并不重要 - 通常情况下,我有一个由大小为2的数组组成的长列表,我想要使用另一个数组来移除一个数组。 - undefined
没错,但是如果你的代码不起作用,我们就无法快速重现你的错误或者测试解决方案了... - undefined
3个回答

4
考虑以下示例:
ls = [1, 2, 3, 1]
ls.remove(1)

这段代码的作用如下:

  1. 遍历ls的元素。
  2. 检查每个元素是否等于1
  3. 如果是,则弹出该元素,并停止遍历。

在第二步中,你的代码尝试比较两个numpy数组,如array1 == array2。问题在于numpy返回一个布尔值数组来表示这种比较。

>>> np.array([1,2]) == np.array([1,3])
array([ True, False], dtype=bool)

所以,你需要实现自己的类似于remove的方法。

def remove_from_array(base_array, test_array):
    for index in range(len(base_array)):
        if np.array_equal(base_array[index], test_array):
            base_array.pop(index)
            break
    raise ValueError('remove_from_array(array, x): x not in array')

使用方法:

i = np.array([1,2])
facets = [np.array([1,2]),np.array([3,4])]
remove_from_array(facets, i)

print facets # [array([3, 4])]

3
最简单的方法是使用all(),逐个比较列表元素和要删除的元素,并返回所有不匹配的元素。请注意,这会删除所有与您想要删除的数组匹配的列表元素。
[ x for x in facets if not (x==i).all()]

但是我实际上需要做什么呢? (facets == np.array(i[0], i[1])).any()返回False,但facets中包含它。 - undefined
我不明白你的意思,只需尝试我编写的代码。这是一个列表推导式;它应该返回一个数组列表。 - undefined
我是说我需要确切地做到这一点:[ x for x in facets if not (x == [i[0], i[1]]),我认为它可以与...(x == np.array(i[0], i[1])一起使用。 - undefined
只要你正确创建数组,它就能正常工作:[ x for x in facets if not (x==np.array([i[0],i[1]])).all()] - undefined
需要注意的是,这个函数的行为与remove不同。它会移除所有相等的元素,而不仅仅是第一个。在许多情况下,这可能是理想的。它还会创建一个新的列表,这可能不是我们想要的。此外,混合使用列表和NumPy数组的一般方法似乎有些可疑。 - undefined
显示剩余3条评论

0
尝试以下内容:
facets.remove(np.array(i[0],i[1]))

以下方法对我有效:

>>> i = list([1,2])
>>> facets = [list([1,2]),list([3,4])]
>>> facets.remove(list([i[0],i[1]]))
>>> facets
[[3, 4]]

1
很不幸,我有一个 np.arrays 的列表而不是一个列表的列表。如果你替换 facets = [np.array(1,2), np.array(3,4)],那是行不通的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接