我有一些代码想要测试矩阵和向量的乘积是否为零向量。我尝试的一个例子是:
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/