2013-12-13 51 views
3

我有一個numpy的陣列比較多值numpy的陣列

a = numpy.array([1,2,3,0]) 

我想這樣做

a == numpy.array([0,1,2,3]) 

,並得到

[[False, True, False, False], 
[False, False, True, False], 
[False, False, False, True ], 
[True, False, False, False]] 

換句話說,我想第i列顯示a的每個元素是否等於i。這感覺就像numpy可能變得容易的那種東西。有任何想法嗎?

回答

3

這裏使用的關鍵概念是廣播。

a = numpy.array([1,2,3,0]) 
b = numpy.array([0,1,2,3]) 
a[..., None] == b[None, ...] 

結果:

>>> a[..., None] == b[None, ...] 
array([[False, True, False, False], 
     [False, False, True, False], 
     [False, False, False, True], 
     [ True, False, False, False]], dtype=bool) 

瞭解如何使用廣播將大大提高你的NumPy的代碼。你可以在這裏讀到它:

1

可以使用列表理解通過a各指標迭代和比較價值b

>>> import numpy as np 
>>> a = np.array([1,2,3,0]) 
>>> b = np.array([0,1,2,3]) 
>>> ans = [ list(a[i] == b) for i in range(len(a)) ] 
>>> ans 
[[False, True, False, False], 
[False, False, True, False], 
[False, False, False, True], 
[ True, False, False, False]] 

我所做的輸出通過創建一個列表的列表匹配您的例子,但是你可以很輕鬆地讓你的答案是一個Numpy數組。

+0

肯定能行。我想知道是否還有更多內置在numpy中。這感覺就像是圖書館的一部分。 – fgregg

1

可以重塑矢量和covector和比較:以上

>>> a = numpy.array([1,2,3,0]) 
>>> b = numpy.array([0,1,2,3]) 
>>> a.reshape(-1,1) == b.reshape(1,-1) 
array([[False, True, False, False], 
     [False, False, True, False], 
     [False, False, False, True], 
     [ True, False, False, False]], dtype=bool) 
1

是這樣做的一種方式。另一種可能的方式(儘管我仍然不相信沒有一個更好的辦法)是:

import numpy as np 
a = np.array([[1, 2, 3, 0]]).T 
b = np.array([[0, 1, 2, 3]]) 
a == b 
array([[False, True, False, False], 
    [False, False, True, False], 
    [False, False, False, True], 
    [ True, False, False, False]], dtype=bool) 

我想你只需要確保一個是列向量,一個是行向量,它會爲你做比較。

+0

這和上面的答案一樣。打我哈哈,我試圖找出格式。我如何讓箭頭出現? – cc7768

+0

如果用「箭頭」表示REPL的'>>>',則可以從解釋器複製它們。 – bernie

+0

正是我的意思是謝謝你。我還學到了一個新的術語。再次感謝。 – cc7768