2013-12-19 159 views
1

我有一些代碼,我想測試矩陣和向量的乘積是否爲零向量。我嘗試的一個例子是:比較兩個向量

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

由於您在測試向量中包含零向量,因此您的內循環始終會「中斷」,這肯定會在'M'的內核中。你想達到什麼目的? –

+0

@SvenMarnach代碼沒有完成,但謝謝你是對的。 – marshall

回答

2

問題是==兩個數組之間是一個元素明智的比較 - 你得到一個布爾值數組。布爾值數組本身不是布爾值,因此您不能在if中使用它。這是錯誤試圖告訴你的。

可能通過使用all方法解決此問題,以檢查布爾數組中的所有元素是否都爲true。但是你讓這種方式比你需要的更復雜。非零值truthy,零個值falsey,所以你可以只使用any沒有一個比較:

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

如果你想比較爲零明確的,只是比較一個標,不建立一個零向量;它會以相同的方式播放。而且,如果你曾經想要構建一個零向量,只需使用zeros函數;不要以複雜的方式構建零件的list,並將其傳遞給asarray

您也可以在這裏使用count_nonzero函數作爲另一種選擇。如果它返回任何真值(即任何非零數字),則該數組至少有一個非零值。

一般而言,您幾乎可以使所有事情都變得更加困難,通過一個簡短的NumPy教程,然後掃描主要文檔頁面以獲取有用的功能將會對您有所幫助。


另外,如果你的價值觀是不是整數,你可能實際上並不想在第一時間進行比較== 0。浮點數累加舍入誤差。要處理該問題,請改用allclose函數。

+0

謝謝你的工作。有關如何改進代碼的其他提示,我會非常感激。在我的情況下,所有的值都是整數。 – marshall

1

的錯誤說你需要使用all

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

np.allnp.dot(M,v) == zerovector給你一個向量,它是兩個向量的成對比較。

+1

使用內建的'all'可以工作,但是它會迫使你用Python迭代vector,而不是讓NumPy更快地完成。一般來說,只要可能,您想要在NumPy中保持迭代。 – abarnert