比较Numpy数组会引发a.any()或a.all()错误

时间:2018-02-13 13:32:11

标签: python arrays python-3.x numpy

我正在尝试以下代码来检查numpy数组的元素是否在另一个'b'列表中找到但是我得到以下错误

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

我试过查找但无法让它工作

如何在这个例子中使用a.all()或其他方法,如numpy.logical_and

import numpy as np
a=np.array([[0,0,0,0,1,0,1,1,0],[0,0,0,0,0,1,1,1,0],[0,0,0,0,0,0,1,1,1]])
b=[]

for item in a :
    if item not in b:
       b.append(item)`

2 个答案:

答案 0 :(得分:3)

没有循环:

b = np.unique(a, axis=0)

这快了几个数量级,而且更加清晰。

答案 1 :(得分:1)

@John Zwinck提供的解决方案可能是此问题的最佳解决方案。如果出于某种原因,我必须使用它来评论循环方法。

循环方法的问题是in和数组测试相等的方式。

Grosso modo,item in b使用相等(item)将b==中的元素进行比较。类似的东西:

def in(x, y):
    for item in y:
        # Notice the use of == to compare two arrays, the result is an array of bool.
        if x == item:
            return True
    return False

因此,如果一个人不能使用np.unique并且明确需要使用循环,那么实现in的变体来比较两个数组。

import numpy as np
a=np.array([[0,0,0,0,1,0,1,1,0],
            [0,0,0,0,0,1,1,1,0],
            [0,0,0,0,0,0,1,1,1]])
b=[]

def in_for_arrays(x, y):
    for item in y:
        # Two arrays are equal if ALL the elements are equal.
        if (x == item).all():
            return True
    return False


for item in a:
    if not in_for_arrays(item, b):
        b.append(item)