2013-10-30 45 views
2

做什麼最好的方法是:給定離散變量的一維數組大小N(這裏N = 4),並且X是獨特數元素,我試圖創建一個大小爲(N * X)的多維數組,其中元素爲1或0,取決於一維數組中元素的出現次數,例如繼array_1D(N = 4,X = 3)將導致大小爲3 array_ND * 4:將離散值的一維數組轉換爲nD中連續值的nD數組

array_1D = np.array([x, y, z, x]) 
array_ND = [[1 0 0 1] 
      [0 1 0 0] 
      [0 0 1 0]] 

感謝,

阿蘇

+0

您的結果將不是NxN - 即使您的示例是3x4。 –

+0

@WarrenWeckesser你是對的。我在你的評論後糾正了這個問題。 –

回答

4

試試這個:

(np.unique(a)[..., None] == a).astype(np.int) 

你可以省略.astype(np.int)部分,如果你想要一個布爾數組。這裏我們使用了broadcasting[..., None]部分)來避免顯式循環。

看,所建議的意見:

>>> import numpy as np 
>>> a = np.array([1, 2, 3, 1]) 
>>> unique_elements = np.unique(a) 
>>> result = unique_elements[..., None] == a 
>>> unique_elements 
array([1, 2, 3]) 
>>> result 
array([[ True, False, False, True], 
     [False, True, False, False], 
     [False, False, True, False]], dtype=bool) 
+1

我剛剛給出幾乎相同的答案。 :)你應該分成兩步。用戶需要保存'np.unique(a)'返回的數組,以便知道數組中值的含義。 –

+0

感謝@MrE的完美答案。 Numpy太棒了! –

+0

非常歡迎:) – YXD

1

如果初始數組包含有效的指標從0n - 1那麼你可以寫

eye = np.eye(3) 
array_1D = np.array([0, 1, 2, 0]) 
array_ND = eye[array_1D] 

結果矩陣將

array([[ 1., 0., 0.], 
     [ 0., 1., 0.], 
     [ 0., 0., 1.], 
     [ 1., 0., 0.]]) 

這是th的轉置一個你期望的。

這裏發生了什麼是numpy使用array_1D的元素作爲行索引eye。因此得到的矩陣包含與array_1D的元素一樣多的行,並且它們中的每一個都與相應的元素相關。 (0涉及1 0 0等)

相關問題