比较两个向量

时间:2013-12-19 19:26:20

标签: python numpy

我有一些代码,我想测试矩阵和向量的乘积是零向量。我尝试的一个例子是:

n =2
zerovector = np.asarray([0]*n)

for column in itertools.product([0,1], repeat = n):
    for row in itertools.product([0,1], repeat = n-1):
        M = toeplitz(column, [column[0]]+list(row))
        for v in itertools.product([-1,0,1], repeat = n):
            vector = np.asarray(v)
            if (np.dot(M,v) == zerovector):
                print M, "No good!"
                break

但是行if (np.dot(M,v) == zerovector):给出错误ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()。这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

问题是两个数组之间的==是一个逐元素的比较 - 你得到一个布尔值数组。布尔值数组本身不是布尔值,因此您无法在if中使用它。这就是错误试图告诉你的。

可以使用all方法解决这个问题,以检查布尔数组中的所有元素是否都为真。但是你这样做比你需要的更复杂。非零值是真实的,零值是假的,因此您可以在不进行比较的情况下使用any

if not np.dot(M, v).any():

如果要将比较显式为零,只需与标量进行比较,不要构建零向量;它会以同样的方式播出。并且,如果您想要构建零向量,只需使用zeros函数;不要以复杂的方式构建list个零并将其传递给asarray

您也可以在此处使用count_nonzero功能作为其他选择。如果它返回任何真值(即任何非零数字),则该数组至少有一个非零值。

一般来说,你几乎所有的东西都比必要的更难,并且通过一个简短的NumPy教程,然后扫描主文档页面以获得有用的功能,这对你有帮助。


另外,如果您的值不是整数,那么您可能实际上并不想首先比较== 0。浮点数累积舍入误差。要处理此问题,请改用allclose函数。

答案 1 :(得分:1)

因为错误说您需要使用all

if all(np.dot(M,v) == zerovector): 

np.allnp.dot(M,v) == zerovector为您提供了一个向量,它是两个向量的成对比较。