python - 比较两个向量

标签 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: 具有多个元素的数组的真值不明确。使用 a.any() 或 a.all()。这样做的正确方法是什么?

最佳答案

问题是两个数组之间的 == 是逐元素比较 - 您会返回一个 bool 值数组。 bool 值数组本身并不是 bool 值,因此您不能在 if 中使用它。这就是错误试图告诉您的内容。

可以通过使用all来解决这个问题方法,检查 bool 数组中的所有元素是否为 true。但你让这种方式变得比你需要的更加复杂。非零值是真值,零值是假值,所以你可以只使用 any没有比较:

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

如果你想明确地与零进行比较,只需与标量进行比较,不要构建零向量;它将以同样的方式广播。而且,如果您确实想要构建一个零向量,只需使用 zeros功能;不要以复杂的方式构建一个由零组成的列表并将其传递给asarray

您还可以使用 count_nonzero在这里作为不同的替代方案。如果它返回任何真值(即任何非零数字),则该数组至少有一个非零数字。

一般来说,您几乎让所有事情都变得比必要的更加困难,并且完成一个简短的 NumPy 教程,然后扫描主要文档页面以获取有用的函数确实会对您有所帮助。

<小时/>

此外,如果您的值不是整数,您可能实际上一开始就不想比较 == 0。 float 会累积舍入误差。要处理这个问题,请使用 allclose函数代替。

关于python - 比较两个向量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20690061/

相关文章:

python - 根据模式搜索重命名多列

python - 使用来自多个 RDD 的相同键提取和保存值的最佳方法

python - 如何在python中将数组转换为数组

python - 如何选择 Pandas 中不以某些 str 开头的行?

python - 描述时间序列 Pandas 中的差距

python - 主函数中声明的变量的范围?

python捕获异常

python - OpenCV houghLinesP 参数

python - 在另一个数组中查找数组的字符串元素

python - Numpy - 使用索引数组索引数组的最后一个维度