我有一些代码,我想测试矩阵和向量的乘积是零向量。我尝试的一个例子是:
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()
。这样做的正确方法是什么?
答案 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.all
。 np.dot(M,v) == zerovector
为您提供了一个向量,它是两个向量的成对比较。